You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:52:24