Python中转换日期列为datetime格式时遇ValueError问题求助
问题描述
尝试用pd.to_datetime将日期列转换为标准datetime格式时,反复报错:
ValueError: time data "1/1/1900" doesn't match format "%Y-%m-%d", at position 1874.
已尝试如下代码但未解决问题,寻求解决建议:
数据样本
dt AverageTemperature AverageTemperatureUncertainty City 0 1743-11-01 6.07 1.74 Århus 1 1743-12-01 NaN NaN Århus 2 1744-01-01 NaN NaN Århus 3 1744-02-01 NaN NaN Århus 4 1744-03-01 NaN NaN Århus 5 1744-04-01 5.79 3.62 Århus 6 1744-05-01 10.64 1.28 Århus 7 1744-06-01 14.05 1.35 Århus 8 1744-07-01 16.08 1.40 Århus 9 1744-08-01 NaN NaN Århus 10 1744-09-01 12.78 1.45 Århus 11 1744-10-01 7.95 1.63 Århus 12 1744-11-01 4.64 1.30 Århus 13 1744-12-01 0.12 1.76 Århus 14 1745-01-01 -1.33 1.64 Århus 15 1745-02-01 -2.73 1.36 Århus 16 1745-03-01 0.13 1.09 Århus 17 1745-04-01 4.04 1.14 Århus 18 1745-05-01 NaN NaN Århus 19 1745-06-01 NaN NaN Århus 20 1745-07-01 NaN NaN Århus 21 1745-08-01 NaN NaN Århus 22 1745-09-01 NaN NaN Århus 23 1745-10-01 NaN NaN Århus 24 1745-11-01 NaN NaN Århus 25 1745-12-01 NaN NaN Århus 26 1746-01-01 NaN NaN Århus 27 1746-02-01 NaN NaN Århus 28 1746-03-01 NaN NaN Århus 29 1746-04-01 NaN NaN Århus Country Latitude Longitude 0 Denmark 57.05N 10.33E 1 Denmark 57.05N 10.33E 2 Denmark 57.05N 10.33E 3 Denmark 57.05N 10.33E 4 Denmark 57.05N 10.33E 5 Denmark 57.05N 10.33E 6 Denmark 57.05N 10.33E 7 Denmark 57.05N 10.33E 8 Denmark 57.05N 10.33E 9 Denmark 57.05N 10.33E 10 Denmark 57.05N 10.33E 11 Denmark 57.05N 10.33E 12 Denmark 57.05N 10.33E 13 Denmark 57.05N 10.33E 14 Denmark 57.05N 10.33E 15 Denmark 57.05N 10.33E 16 Denmark 57.05N 10.33E 17 Denmark 57.05N 10.33E 18 Denmark 57.05N 10.33E 19 Denmark 57.05N 10.33E 20 Denmark 57.05N 10.33E 21 Denmark 57.05N 10.33E 22 Denmark 57.05N 10.33E 23 Denmark 57.05N 10.33E 24 Denmark 57.05N 10.33E 25 Denmark 57.05N 10.33E 26 Denmark 57.05N 10.33E 27 Denmark 57.05N 10.33E 28 Denmark 57.05N 10.33E 29 Denmark 57.05N 10.33E
当前代码
# 指定CSV文件路径 csv_file = "Data.csv" # 读取CSV文件生成DataFrame df = pd.read_csv(csv_file) # 将'dt'列转换为datetime类型,自动推断格式 df['dt'] = pd.to_datetime(df['dt'], infer_datetime_format=True) # 从'dt'列提取年份 df['Year'] = df['dt'].dt.year # 删除含NaN值的行 df = df.dropna() # 设置pandas显示格式 pd.set_option('display.float_format', '{:.2f}'.format) # 打印被移除的NaN值数量 nan_count = df.isnull().sum().sum() print("Number of NaN values removed:", nan_count) # 打印DataFrame统计摘要 print("Summary of the DataFrame:") print(df.describe()) # 打印更新后的DataFrame print("Updated DataFrame:") print(df)
解决方法
报错核心原因是数据中存在混合日期格式:大部分是YYYY-MM-DD,但部分行是M/D/YYYY(如1/1/1900),infer_datetime_format=True无法同时识别两种格式,导致解析失败。以下是几种可行的解决思路:
1. 直接支持多种格式解析
利用pandas的混合格式解析能力,一次性兼容所有可能的日期格式:
# pandas 2.0+版本推荐用法 df['dt'] = pd.to_datetime(df['dt'], format='mixed') # 旧版本pandas可手动指定多种格式 df['dt'] = pd.to_datetime(df['dt'], format=['%Y-%m-%d', '%m/%d/%Y'])
2. 定位错误数据后针对性处理
先筛选出无法解析的日期,查看格式特征后单独转换:
# 先标记无法解析的日期(错误值转为NaT) df['dt_parsed'] = pd.to_datetime(df['dt'], errors='coerce') # 查看所有无效日期的唯一值 print(df[df['dt_parsed'].isna()]['dt'].unique()) # 对带斜杠的日期单独转换格式 mask = df['dt'].str.contains('/') df.loc[mask, 'dt'] = pd.to_datetime(df.loc[mask, 'dt'], format='%m/%d/%Y').dt.strftime('%Y-%m-%d') # 再统一转换为datetime类型 df['dt'] = pd.to_datetime(df['dt'])
3. 读取CSV时直接解析日期
在读取文件阶段就指定解析日期列,提前处理混合格式:
# pandas 2.0+版本 df = pd.read_csv(csv_file, parse_dates=['dt'], date_format='mixed') # 旧版本pandas配合自动推断 df = pd.read_csv(csv_file, parse_dates=['dt'], infer_datetime_format=True)
4. 用第三方库处理任意格式
如果日期格式极其混乱,可使用dateutil的通用解析器:
from dateutil import parser df['dt'] = df['dt'].apply(lambda x: parser.parse(x))
内容的提问来源于stack exchange,提问作者talha asif
相关产品推荐
相关产品推荐

