将日期从整数转换为日期格式

Convert date from integer to date format

我有一列 'start_date',它是一个整数 37823。这发生在我使用 xlrd 库将 xlsx 转换为 csv 时。因此 '2003/07/21' 被转换为 37823.

我已经阅读了 xlrd 文档并且我知道有几种方法可以将其转换为最新的。但是,我需要在 AWS Glue ETL 作业中使用 PySpark 将其转换为日期格式。有什么建议吗?

我尝试使用 to_date、date_format 函数,但没有任何效果。

我想有更优雅的方法可以做到这一点,但这是我现在想到的。

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

希望这对你有用:)

我终于解决了这个问题。

使用 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())

希望对您有所帮助!

看起来像 12/30/1899 + 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()