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

如何将DataFrame中的月日字符串转为datetime?解决补年及日期越界问题

解决方案:处理无年份的月日列转换及日期有效性问题

1. 解决自动添加1900年的问题

datetime类型必须包含年、月、日三个维度,仅传入月日时会默认补全1900年。如果需要指定年份(比如当前年份),可以通过以下两种方式处理:

方法1:拼接指定年份后转换

import pandas as pd
from datetime import datetime

df = pd.DataFrame({'id':[78,18,94,55,68,57,78,8],
                   'monthday':['1-29','1-28','1-27','1-19','1-28','1-19','1-29','1-28']})

# 指定2024年进行转换
df['month_day'] = pd.to_datetime('2024-' + df['monthday'], format='%Y-%m-%d')

方法2:仅保留月日信息(用Period类型)

如果不需要完整的日期维度,只想保留月日的周期信息,可以使用Period类型:

# 转换为仅含月日的Period对象
df['month_day_period'] = pd.PeriodIndex(df['monthday'], freq='D')

2. 解决"day is out of range for month"错误

这个错误是因为数据中存在无效的月日组合(比如2月30日、4月31日这类不存在的日期),可以通过两种方式处理:

方式1:强制转换,无效值转为NaT

使用errors='coerce'参数,将无效日期转为NaT(Not a Time),后续可筛选出无效数据排查:

df['month_day'] = pd.to_datetime('2024-' + df['monthday'], format='%Y-%m-%d', errors='coerce')

# 查看无效日期的行
invalid_rows = df[df['month_day'].isna()]
print(invalid_rows)

方式2:提前验证并清洗数据

编写验证函数,提前筛选或标记无效日期:

def check_valid_date(monthday_str, year=2024):
    try:
        datetime.strptime(f'{year}-{monthday_str}', '%Y-%m-%d')
        return True
    except ValueError:
        return False

# 标记每行日期是否有效
df['is_valid_date'] = df['monthday'].apply(check_valid_date)

# 仅保留有效日期的行
valid_df = df[df['is_valid_date']]

内容的提问来源于stack exchange,提问作者Rebecca James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:05:18