我有一列“ start_date”,它是一个整数37823。这是在我使用xlrd库将xlsx转换为csv时发生的。因此,“ 2003/07/21”转换为37823。
我已经阅读了xlrd文档,并且了解到有几种将其转换为日期的方法。但是,我需要在AWS Glue ETL作业中使用PySpark将其转换为日期格式。有什么建议吗?
我尝试使用to_date,date_format函数,但无济于事。
答案 0 :(得分:1)
我想有更多优雅的方法可以做到这一点,但这就是我现在想出的。
from datetime import date
df.hire_date = df.hire_date.apply(date.fromordinal) # this will give you date in dash format
df.hire_date = df.hire_date.apply(lambda x: str(x).replace('-', '/')) # this will simply replace dash with slash
希望这对您有用:)
答案 1 :(得分:1)
我终于能够解决此问题。
使用UDF:
def convert_date(x):
mDt = datetime.datetime(1899, 12, 30)
dlt = mDt + datetime.timedelta(days=x)
return dlt.strftime("%Y-%m-%d")
convert_date_udf = udf(lambda z: convert_date(z), StringType())
df = df.withColumn('hire date', convert_date_udf('hire date').alias('hire date new'))
不使用UDF:
df = df.withColumn('hire date', F.expr("date_add(to_date('1899-12-30'), cast(`hire date` as int))").cast(StringType())
希望有帮助!
答案 2 :(得分:0)
看起来像 1899年12月30日+ 37823天= 2003/07/21
您可以在下面使用此date_add函数来代替UDF或python函数。 UDF应该比pyspark函数要慢一些。
weird_date = 37823
df = spark.createDataFrame([('1899-12-30',)], ['dt'])
df.select(date_add(df.dt, weird_date).alias('converted_date')).collect()