为什么Pandas导出CSV时datetime列的日/月显示位置会随机切换?
问题根因
该异常的核心原因是你调用pd.read_csv解析日期时没有显式指定原始日期格式,pandas的自动日期推断逻辑对dd.mm.yyyy格式的日期存在识别歧义:
- 当日期的日字段数值大于12时,pandas只能将其识别为日部分,解析为
日.月.年格式,结果正确 - 当日期的日字段数值小于等于12时,pandas会随机将部分日期误判为
月.日.年格式,导致日期的日月属性本身就解析错误,后续strftime输出时自然会出现日月位置颠倒的情况,看起来就像格式中途切换。
另外如果你在拆分前做了排序操作,若排序对象是字符串格式的日期而非datetime类型的日期,也会因为字符串按字符顺序排列的特性,出现1月2号排在1月31号之后的错乱,进一步加剧看起来格式切换的错觉。
修复方案
修改读取文件的代码,显式指定日期解析规则,避免自动推断出错,同时优化后续逻辑避免警告和多余输出:
# 自定义日期解析函数,适配原始数据的%d.%m.%Y + %H:%M格式 date_parser = lambda x: pd.to_datetime(x, format='%d.%m.%Y %H:%M') file = pd.read_csv('datta.csv', sep = ';', skiprows = 56, parse_dates = [['Date','Time']], date_parser=date_parser) # 传入自定义解析规则 # 读入后Date_Time已经是datetime类型,无需重复转换 years_pre = file['Date_Time'].dt.year # 按年份拆分导出 for year_XX in range(years_pre.min(), years_pre.max()+1): print(f"Creating file (15 min) for the year: {year_XX}") df_subset_15 = file[years_pre == year_XX].copy() # 加copy避免链式赋值警告 df_subset_15['Date_Time'] = df_subset_15['Date_Time'].dt.strftime('%d/%m/%Y %H:%M') # 加index=False去掉输出CSV里第一列的多余行号 df_subset_15.to_csv(f"data_(15 min)_year_{year_XX}.csv", index=False)
内容的提问来源于stack exchange,提问作者Sultry T.
相关产品推荐
相关产品推荐

