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

如何在CSV读写过程中保持datetime64[ns, Europe/Berlin]时间类型不变

解决方案

CSV属于纯文本格式,本身不会保留数据的类型元信息,所以带时区的datetime类型写入后会被序列化为字符串,默认读取时会被识别为object类型,你可以通过调整读取逻辑或者同时调整读写逻辑实现类型一致:

方法1:仅调整读取逻辑(无需修改写入代码)

读取时显式指定解析time列为带时区的datetime类型即可,示例代码:

import pandas as pd

df = pd.read_csv(
    'test.csv',
    # 指定要解析为时间类型的列
    parse_dates=['time'],
    # 开启时间格式自动推断,提升解析速度
    infer_datetime_format=True,
    # 保留时区信息,不强制转成无时区的datetime
    date_parser=lambda x: pd.to_datetime(x, utc=False)
)

读取后可通过df['time'].dtype验证,会和写入前的带时区datetime类型完全一致。

方法2:同时调整读写逻辑(兼容性更高)

如果担心不同环境下时间字符串解析规则不一致,可以写入时额外存储时间戳,读取后直接从时间戳恢复时区信息,完全避免字符串解析的误差:

  • 写入前新增毫秒级时间戳列:
# 保留原time列的同时新增时间戳辅助列
df['time_timestamp'] = df['time'].view('int64') // 10**6
df.to_csv('test.csv', index=False)
  • 读取时从时间戳恢复原类型:
df = pd.read_csv('test.csv')
mytz = get_localzone()
df['time'] = pd.to_datetime(df['time_timestamp'], unit='ms').dt.tz_convert(mytz)
# 不需要的话可删除辅助列
df = df.drop(columns=['time_timestamp'])

这种方式不受时间字符串格式变化的影响,恢复的类型100%和写入前一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:03