如何在DataFrame序列化为JSON Lines文件时保留原日期格式?
解决JSON Lines序列化时日期格式被修改的问题
这个问题本质上是因为pandas的datetime64类型会保留纳秒级精度——即便你的日期显示看起来只到秒,实际存储中可能带有微小的微秒值(比如数据导入时的精度误差,或是后续操作引入的)。当使用date_format='iso'序列化时,pandas会把这些隐藏的微秒部分也输出,导致日期格式多出.000005这样的后缀。
下面是两种可靠的解决方法:
方法1:将日期列转换为指定格式的字符串
这是最直接的方式,能完全控制日期的输出格式,避免pandas自动处理精度:
# 假设你的日期列名为'date' df['date'] = df['date'].dt.strftime('%Y-%m-%d %H:%M:%S') # 再序列化到JSON Lines df.to_json('df.jsonl', orient='records', lines=True)
处理后,日期会以你想要的YYYY-MM-DD HH:MM:SS格式写入文件,不会出现额外的微秒部分。
方法2:截断datetime的微秒部分(保留datetime类型)
如果你想继续保留列的datetime类型,只是去掉微秒部分,可以先对日期列做精度截断:
# 截断到秒级,去掉微秒 df['date'] = df['date'].dt.floor('s') # 再序列化,此时date_format='iso'会输出不带微秒的ISO格式(注意ISO格式用'T'分隔日期和时间) # 如果需要保留空格分隔的原始格式,更推荐方法1 df.to_json('df.jsonl', orient='records', lines=True, date_format='iso')
额外检查
你可以先确认日期列是否真的带有微秒:
# 查看日期列的微秒部分 print(df['date'].dt.microsecond)
如果输出不全是0,说明确实存在微秒值,这就是序列化时出现后缀的原因。
内容的提问来源于stack exchange,提问作者viktor_dmitry
相关产品推荐
相关产品推荐

