python - Pyspark:日期时间列中的不匹配值
问题描述
我的 pyspark 列中大多数(字符串)日期的格式如下所示:Thu Jul 01 15:32:02 +0000 2021
我想将它转换成这样的日期格式:01-07-2021 我找到了一种可行的方法,不幸的是,只有当列是干净的,也就是当字符串具有以下格式时:'%a %b %d % H:%M:%S +0000 %Y'
这是我使用的代码:
from datetime import datetime
import pytz
from pyspark.sql.functions import udf, to_date, to_utc_timestamp
# Converting date string format
def getDate(x):
if x is not None:
return str(datetime.strptime(x,'%a %b %d %H:%M:%S +0000 %Y').replace(tzinfo=pytz.UTC).strftime("%Y-%m-%d %H:%M:%S"))
else:
return None
# UDF declaration
date_fn = udf(getDate, StringType())
# Converting datatype in spark dataframe
df = df.withColumn("date", to_utc_timestamp(date_fn("date"),"UTC"))
有什么方法可以添加一些检测不匹配格式的代码,然后删除观察或将其变为空?
谢谢!
解决方案
使用to_date将字符串转换为使用给定格式的日期。如果字符串与格式不匹配,则结果将为null
.
有一个小限制to_date
无法解析星期几:
'E'、'F'、'q' 和'Q' 符号只能用于日期时间格式,例如date_format。它们不允许用于日期时间解析,例如 to_timestamp。
最简单的方法是在使用之前从日期字符串中删除前三个字符to_date
:
data = [["Thu Jul 01 15:32:02 +0000 2021"],
["Thu Jul 01 15:32:02 +0200 2021"],
["Thu Jul 01 15:32:02 2021"],
["2021-07-01 15:32:02"],
["this is not a valid time"]]
df = spark.createDataFrame(data, schema=["input"])
df.withColumn("date", F.to_date(F.substring("input",5,100),
"MMM dd HH:mm:ss xx yyyy")).show(truncate=False)
输出:
data = [["Thu Jul 01 15:32:02 +0000 2021"],...
+------------------------------+----------+
|input |date |
+------------------------------+----------+
|Thu Jul 01 15:32:02 +0000 2021|2021-07-01|
|Thu Jul 01 15:32:02 +0200 2021|2021-07-01|
|Thu Jul 01 15:32:02 2021 |null |
|2021-07-01 15:32:02 |null |
|this is not a valid time |null |
+------------------------------+----------+
推荐阅读
- android - 尝试根据类型将用户发送到不同的活动。不断获取运算符不能应用于数据库引用和字符串
- ios - UIDocumentPickerViewController 只显示最近标签
- google-earth-engine - GEE randomPoints 不是随机分布在多边形内
- python - 使用访问级数据框中的准入和出院时间按每小时分组数据
- bison - 野牛转移/减少冲突模棱两可
- docker - Docker swarm 中 traefik V2 背后的 Redis 服务器
- reactjs - 在 React Js 中添加密码保护网站
- windows - 使用计划任务时,Powershell 函数 LogonUser 返回不同的错误代码
- r - 在回归循环中找到 AIC 和 R 方
- java - Log4j2:TimeBasedTriggeringPolicy 触发一行太晚