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
相关产品推荐
相关产品推荐

