使用Pandas读写CSV时如何保持datetime64[ns]数据类型不变?
解决Pandas读写CSV时datetime类型变为object的问题
这个问题我碰到过好多次了!其实核心原因很简单:CSV是纯文本格式,没办法直接保留datetime64[ns]这种结构化数据类型,所以保存时Pandas会自动把datetime列转成字符串格式,读取回来后默认就成了object类型。这和编码类型完全无关——编码只影响文本字符的正确读写,不会改变数据类型的解析逻辑。
下面给你几个实用的解决办法,按推荐程度排序:
1. 读取时直接指定解析日期列
在pd.read_csv()里用parse_dates参数指定要解析的列名,Pandas会自动把这些列转成datetime64[ns]类型:
# 写入时可以加date_format确保日期格式统一(可选但推荐) df.to_csv(fileName, date_format='%Y-%m-%d %H:%M:%S') # 读取时指定parse_dates参数 DF = pd.read_csv(fileName, sep=',', parse_dates=['TimeSeries']) # 此时DF.TimeSeries的dtype就是datetime64[ns]了
加上date_format是为了让写入的日期格式更规范,避免读取时因格式不统一出现解析失败的情况。
2. 读取后手动转换日期列
如果已经读取了数据,也可以用pd.to_datetime()手动转换目标列:
DF = pd.read_csv(fileName, sep=',') # 转换TimeSeries列为datetime类型,还可以处理异常格式 DF['TimeSeries'] = pd.to_datetime(DF['TimeSeries'], errors='coerce')
这种方法适合临时处理已读入的DataFrame,errors='coerce'参数能把无效的日期格式转成NaT(缺失值),避免程序报错。
3. 用二进制格式替代CSV(进阶方案)
如果需要频繁读写且要严格保留所有数据类型,推荐用Feather或Parquet这类二进制格式,它们可以直接保留Pandas的所有数据类型,包括datetime:
# 写入Feather格式 df.to_feather(fileName.replace('.csv', '.feather')) # 读取Feather格式 DF = pd.read_feather(fileName.replace('.csv', '.feather')) # 此时DF.TimeSeries的dtype依然是datetime64[ns]
这种方法读写效率更高,还能节省存储空间,但需要确保读取方也支持这些格式。
内容的提问来源于stack exchange,提问作者Animate_Ant
相关产品推荐
相关产品推荐

