PySpark日期时间函数返回null 无法基于Date列生成年月列如何解决
转换失败核心原因
- 时间格式串与实际数据不匹配:
- 原代码使用的
hh为12小时制小时标识,数据中存在13:00这类24小时制时间,需改用大写H匹配24小时制 - 原代码使用的
MM、dd要求月份、日期为带前导零的两位格式,数据中9月、5日等均为单数字无前置零,需改用M、d匹配
- 部分日期字符串头部存在多余空格,直接转换会导致格式匹配失败
- 直接对字符串类型的
Date字段调用year、month函数时,PySpark会按默认格式隐式转换为时间类型,与数据格式不匹配,因此全部返回空值
解决方案
推荐使用to_timestamp函数进行转换,代码如下:
# 先去除日期字符串两端空格,再用匹配的格式转换为时间类型 df = df.withColumn("parsed_date", F.to_timestamp(F.trim(F.col("Date")), "M/d/yyyy H:mm")) # 提取年份和月份 df = df.withColumn("Year", F.year("parsed_date")) df = df.withColumn("Month", F.month("parsed_date"))
如果使用的PySpark版本较低不支持to_timestamp,可以用unix_timestamp兼容写法:
df = df.withColumn("parsed_date", F.from_unixtime(F.unix_timestamp(F.trim(F.col("Date")), "M/d/yyyy H:mm")).cast(types.TimestampType()) ) df = df.withColumn("Year", F.year("parsed_date")) df = df.withColumn("Month", F.month("parsed_date"))
结果验证
执行以下代码查看转换结果:
df.select("Date", "parsed_date", "Year", "Month").show(20, truncate=False)
转换后的时间列不会再出现空值,年份、月份均可正常提取。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

