You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用pandas-on-spark将Parquet字符串列转为datetime64[ns]

解决方案

要在pandas-on-spark中高效将字符串列转为datetime类型,不要用astype,改用pandas-on-spark原生的时间解析方法,或者在Spark DataFrame阶段提前转换,具体方法如下:

方法1:使用pandas-on-spark原生to_datetime(推荐)

pandas-on-spark的Series.to_datetime是分布式实现的,性能远优于本地的pd.to_datetime,且能正确解析字符串格式:

情况1:已知字符串格式(性能最优)

如果明确col3的时间字符串格式,直接指定format参数:

df = spark.read.parquet("input.parquet")
psdf = df.to_pandas_on_spark()

# 替换为你的时间字符串实际格式,比如%Y-%m-%d %H:%M:%S
psdf['reCasted'] = psdf['col3'].to_datetime(format='%Y-%m-%d %H:%M:%S')

情况2:未知格式,自动推断

如果不确定格式,可让方法自动推断(比指定格式稍慢,但仍比pd.to_datetime高效):

psdf['reCasted'] = psdf['col3'].to_datetime(errors='coerce')  # 转换失败返回NaT

方法2:在Spark DataFrame阶段提前转换

如果数据量较大,在读取Parquet后直接用Spark的to_timestamp函数转换,再转为pandas-on-spark DataFrame,性能可能更优:

from pyspark.sql.functions import to_timestamp

df = spark.read.parquet("input.parquet")
# 指定时间格式,或省略format让Spark自动推断
df = df.withColumn("reCasted", to_timestamp(df.col3, "yyyy-MM-dd HH:mm:ss"))
psdf = df.to_pandas_on_spark()

为什么astype会失败?

astype('datetime64[ns]')仅适用于可直接转换为datetime的类型(比如整数时间戳、已标准化的datetime字符串),对于非标准格式的字符串,pandas-on-spark不会自动解析格式,因此直接返回NaT。必须用专门的时间解析方法来处理字符串转datetime的场景。

内容的提问来源于stack exchange,提问作者user2531569

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:22:50