网页爬取CSV文件的日期时间格式化异常排查与解决咨询
问题分析与解决方法
异常原因
- Pandas的
pd.to_datetime()在未指定格式时会自动推断日期规则,当遇到01/08/22这种同时符合dd/mm/yy和mm/dd/yy的歧义格式时,会默认倾向美式日期规则(mm/dd/yy)解析,导致日、月颠倒。 - 当日期中的日部分大于12时(如
13/08/22),由于月份不能超过12,Pandas只能切换到dd/mm/yy规则解析,这就造成了解析规则前后不一致的现象。 - 你提到异常出现在从大CSV筛选到目标CSV的过程中,大概率是筛选或写入目标CSV时,没有严格保留原始日期字符串的格式规范,进一步加重了解析的歧义性。
后续避免方法
- 强制指定日期格式:永远不要依赖自动推断,在读取CSV或解析日期时,显式声明日期格式字符串,彻底消除歧义。
- 规范CSV读写流程:在筛选、导出CSV的过程中,确保日期字符串的格式完全一致,避免中间步骤对日期字符串进行无意义的修改。
数据修正与图表绘制
方法1:从原始大CSV重新读取(优先推荐)
如果还保留着未筛选的原始大CSV,直接在读取时指定日期格式解析:
import pandas as pd # 按dd/mm/yy HH:MM格式解析日期列 data = pd.read_csv('原始数据.csv', parse_dates=['date/time'], date_format='%d/%m/%y %H:%M')
解析完成后即可直接用Pandas绘制时间序列图表。
方法2:修正已筛选的目标CSV数据
如果只有筛选后的目标CSV,先将日期列转为字符串,再指定格式重新解析:
import pandas as pd data = pd.read_csv('筛选后数据.csv') # 确保日期列是字符串类型,截取掉AM/PM部分后指定格式解析 data['date/time'] = pd.to_datetime(data['date/time'].astype(str).str[:14], format='%d/%m/%y %H:%M')
方法3:修复已解析错误的日期数据
如果已经有解析错误的DataFrame,可以通过判断月份是否合法来修正:
def correct_date(dt): # 若解析后的月份大于12,说明是日和月颠倒了 if dt.month > 12: return dt.replace(month=dt.day, day=dt.month) return dt data['date/time'] = data['date/time'].apply(correct_date)
修正完成后,将date/time列设置为索引,即可正常绘制时间序列图表:
data.set_index('date/time', inplace=True) # 绘制利率时间序列图 data['利率'].plot(figsize=(12,6))
内容的提问来源于stack exchange,提问作者tmdev
相关产品推荐
相关产品推荐

