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

