问题描述
我有一个日期列为 yyyyddd
的 pySpark 数据框,其中 yyyy
是年份(格式 2020、2021),ddd
是年份中的日期(格式 001、365、 366)。
我正在尝试将其转换为日期:
df = df.withColumn("new_date",to_date("old_date","yyyyddd"))
但这仅给了我 1 月日期的正确答案,而所有其他月份的答案为“Null”。
old_date 是 StringType
,new_date 是 DateType
旧日期 | 新日期 |
---|---|
2006272(表示 2006 年的第 272 天) | 空 |
2008016 | 2008-01-16 |
2011179 | 空 |
2011026 | 2011-01-26 |
如何转换这种日期格式?
解决方法
您可以使用 D
格式表示 day of year
函数中的 unix_timestamp
,如下所示。您不需要 UDF
来执行此操作
# Import functions
import pyspark.sql.functions as f
df.withColumn("new_date",f.from_unixtime(f.unix_timestamp("old_date",'yyyyD'),'yyyy-MMdd'))
,
如果您不介意使用 udf,则可以使用 datetime
import datetime
import pyspark.sql.functions as F
from pyspark.sql.types import DateType
udf_todate = F.udf(lambda x: datetime.datetime.strptime(x,'%Y%j'),DateType())
df = df.withColumn("new_date",udf_todate("old_date"))