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

Pandas读取SQL写入Parquet时datetime列转Epoch时间戳如何解决

解决Pandas写入Parquet时Datetime列转为Epoch时间戳的问题

问题核心是SQL读取的datetime列未被识别为Pandas的datetime64类型,导致写入Parquet时被转为Epoch时间戳。以下是几种直接的解决方法:

方法一:读取SQL时显式解析datetime列

利用pd.read_sql的parse_dates参数,指定需要解析为datetime类型的列名,让Pandas在读取阶段就完成类型转换:

sql = 'Select ' + columnsname +' FROM ' + tablename
print(sql)
# 替换为你的实际datetime列名,比如['order_time', 'pay_time']
datetime_cols = ['your_datetime_column1', 'your_datetime_column2']
dfsql = pd.read_sql(sql, cnxn, parse_dates=datetime_cols)
dfsql.to_parquet('/NightWalk/Original/'+file+'_sql.parquet')

方法二:读取后手动转换datetime类型

如果不确定列名或读取后发现类型异常,可手动将疑似时间戳的列转为datetime类型:

sql = 'Select ' + columnsname +' FROM ' + tablename
print(sql)
dfsql = pd.read_sql(sql, cnxn)

# 方法1:指定列转换(推荐)
dfsql['your_datetime_column'] = pd.to_datetime(dfsql['your_datetime_column'], unit='s') # 单位根据实际情况调整,如ms

# 方法2:自动遍历尝试转换(适合不确定列名的场景)
for col in dfsql.columns:
    if dfsql[col].dtype in ['int64', 'float64']:
        try:
            dfsql[col] = pd.to_datetime(dfsql[col], unit='s')
        except:
            pass # 转换失败则跳过该列

dfsql.to_parquet('/NightWalk/Original/'+file+'_sql.parquet')

方法三:写入Parquet时指定引擎参数

使用pyarrow引擎(需提前安装pyarrow包),确保datetime类型被正确序列化:

sql = 'Select ' + columnsname +' FROM ' + tablename
print(sql)
dfsql = pd.read_sql(sql, cnxn)
# 若需兼容旧版Parquet工具,可添加use_deprecated_int96_timestamps=True参数
dfsql.to_parquet('/NightWalk/Original/'+file+'_sql.parquet', engine='pyarrow')

关键检查步骤

在写入前执行print(dfsql.dtypes),确认datetime列的类型为datetime64[ns],若显示为int64或float64,说明读取阶段未正确解析,需用上述方法处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:17:13