Pandas 系列:将 DateTime 减 100 年

Pandas Series: Decrement DateTime by 100 Years

我有一个pandas系列如下...

0  2039-03-16 
1  2056-01-21 
2  2051-11-18 
3  2064-03-05 
4  2048-06-05

Name: BIRTH, dtype: datetime64

它是从字符串数据创建的,如下所示

s = data['BIRTH']
s = pd.to_datetime(s)
s

我想将 2040 年之后的所有日期转换为 1940 年

我可以按如下方式对单个记录执行此操作

s.iloc[0].replace(year=d.year-100)

但我真的只想 运行 整个系列。我搞不定。帮忙!??

PS - 我知道 pandas 之外还有其他方法可以使用 Python 的 DT 模块,但我想了解如何在 Pandas 中执行此操作

这里使用 DateOffset 是显而易见的选择:

df['date'] - pd.offsets.DateOffset(years=100)

0   1939-03-16
1   1956-01-21
2   1951-11-18
3   1964-03-05
4   1948-06-05
Name: date, dtype: datetime64[ns]

分配回来:

df['date'] -= pd.offsets.DateOffset(years=100)
df
        date
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05

我们有 offsets 模块来处理 non-fixed 频率,在这种情况下它会派上用场。


要修复您的代码,您可能希望使用 apply 逐行应用 datetime.replace(不推荐):

df['date'].apply(lambda x: x.replace(year=x.year-100))

0   1939-03-16
1   1956-01-21
2   1951-11-18
3   1964-03-05
4   1948-06-05
Name: date, dtype: datetime64[ns]

或者使用列表理解,

df.assign(date=[x.replace(year=x.year-100) for x in df['date']])

        date
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05

这些都不能很好地处理 NaT 条目。