如何用Python修改日期列年份(不改动月日)?修复DataFrame日期错误
修复DataFrame日期列的年份错误(2019→2017)
搞定这个日期修复问题很简单,而且完全可以自动化处理,尤其适合大型数据集的子集操作。我给你一步步拆解:
1. 先确保日期列是datetime类型
处理日期的前提是让列变成datetime格式——如果你的'Date Posted'目前是字符串,先转成datetime,这样才能直接操作年份:
import pandas as pd # 转换为datetime类型,errors='coerce'会把无效日期转成NaT(方便后续排查) df['Date Posted'] = pd.to_datetime(df['Date Posted'], errors='coerce')
2. 自动化修复2019→2017的年份错误
这里有两种高效方法,分别适合不同场景:
方法一:精准替换指定年份(灵活通用)
如果你需要把所有2019年的日期精准改成2017年,月日完全不变,用这个方法逻辑最清晰,适合任何年份替换需求:
# 筛选出年份为2019的行 mask = df['Date Posted'].dt.year == 2019 # 对筛选出的日期,替换年份为2017(月日、时分秒都保持原样) df.loc[mask, 'Date Posted'] = df.loc[mask, 'Date Posted'].apply(lambda x: x.replace(year=2017))
这个方法的好处是:哪怕以后遇到其他年份错误(比如2020→2018),只需要修改mask里的年份和replace的目标年份就行,非常灵活。
方法二:矢量化调整年份(大数据友好)
如果你的数据集特别大,追求极致速度,用这个矢量化操作的方法,比apply快很多:
mask = df['Date Posted'].dt.year == 2019 # 给筛选出的日期减去2年(2019-2=2017),月日自动保留 df.loc[mask, 'Date Posted'] = df.loc[mask, 'Date Posted'] - pd.DateOffset(years=2)
注意:这个方法只适用于年份是固定差值的情况(比如减2年、加3年),如果是跨不同差值的年份替换,还是用方法一更合适。
3. 验证修复结果
改完之后一定要确认一下,避免漏改或者误改:
# 查看所有年份的分布,确认2019的数量为0 print(df['Date Posted'].dt.year.value_counts()) # 检查是否还有遗漏的2019年日期(正常应该输出空DataFrame) print(df[df['Date Posted'].dt.year == 2019])
通用修改日期年份的技巧
如果以后需要修改所有日期的年份(不管原来年份是多少),可以直接用:
# 把所有日期的年份改成2020,月日不变 df['Date Posted'] = df['Date Posted'].apply(lambda x: x.replace(year=2020))
内容的提问来源于stack exchange,提问作者user9264558
相关产品推荐
相关产品推荐

