PySpark date_add返回NULL值:Excel整数日期转换异常排查
解决PySpark中Excel整数日期转真实日期的问题
问题根源
你的代码返回NULL主要有两个原因:
- 日期格式不匹配:
to_timestamp使用的'd/M/yy'格式和输入的'1899-12-30'(yyyy-MM-dd)不兼容,导致基准日期转换失败,后续计算自然返回NULL。 - 列引用错误:
cast('Date_Column' as Integer)里的单引号把列名变成了字符串常量,而非引用DataFrame中的列值,无法获取到实际的日期偏移量。
正确解决方案
方法1:修复expr表达式
修正格式字符串,去掉列名的单引号,同时统一用to_date(因为只需要日期,不需要时间戳):
df = df.select( col('Date_Column'), expr("date_add(to_date('1899-12-30', 'yyyy-MM-dd'), cast(Date_Column as Integer))").alias('New_Date_Column') )
方法2:用PySpark函数链式调用(更直观)
避免使用expr,直接用PySpark内置函数组合,可读性更强:
from pyspark.sql.functions import col, date_add, to_date df = df.select( col('Date_Column'), date_add(to_date('1899-12-30', 'yyyy-MM-dd'), col('Date_Column').cast('int')).alias('New_Date_Column') )
方法3:处理带时间的Excel日期(可选)
如果你的Date_Column包含小数(比如2.5表示1900-01-01 12:00:00),可以用时间戳直接计算:
from pyspark.sql.functions import col, expr # 把偏移量转为天数+秒数,生成带时间戳的完整日期 df = df.select( col('Date_Column'), expr("to_timestamp('1899-12-30', 'yyyy-MM-dd') + interval 1 day * Date_Column").alias('New_Date_Timestamp') )
验证结果
执行上述代码后,Date_Column为2时,New_Date_Column会正确返回1900-01-01,其他整数偏移量也会得到对应的正确日期。
内容的提问来源于stack exchange,提问作者przemekwin
相关产品推荐
相关产品推荐

