从pandas中的datetime列中减去一年

mlmc2os5  于 2023-09-29  发布在  其他
关注(0)|答案(5)|浏览(132)

我有一个日期时间列如下-

>>> df['ACC_DATE'].head(2)
538   2006-04-07
550   2006-04-12
Name: ACC_DATE, dtype: datetime64[ns]

现在,我想从这一列的每一行中减去一年。我如何才能达到同样的效果&我可以使用哪个库?
期望的字段-

ACC_DATE    NEW_DATE
538   2006-04-07  2005-04-07
549   2006-04-12  2005-04-12
ve7v8dk2

ve7v8dk21#

您可以使用DateOffset来实现这一点:

In[88]:
df['NEW_DATE'] = df['ACC_DATE'] - pd.DateOffset(years=1)
df

Out[88]: 
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12
9udxz4iz

9udxz4iz2#

使用日期偏移:

df["NEW_DATE"] = df["ACC_DATE"] - pd.offsets.DateOffset(years=1)
print (df)
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12
5anewei6

5anewei63#

你可以使用pd.Timedelta:

df["NEW_DATE"] = df["ACC_DATE"] - pd.Timedelta(days=365)

或替换:

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x.replace(year=x.year - 1))

但是它们都不会捕获闰年,所以你可以使用dateutil.relativedelta

from dateutil.relativedelta import  relativedelta

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x - relativedelta(years=1))
qyyhg6bp

qyyhg6bp4#

如果有单个pd.Timestamp对象而不是列,
1.使用pd.DateOffset(years=n)并不理想,因为它会产生:
用户警告:在转换中丢弃非零纳秒

  1. pd.Timedelta()不接受年份。
    在这种情况下,对我来说唯一有效的方法是pd.Timestamp.replace
t = pd.Timestamp.now()
t = t.replace(year=t.year - n)

这在answer by Padriac中有所暗示,但需要进一步澄清。

yvfmudvl

yvfmudvl5#

您可以使用Timedelta与字符串:

df['col'] - pd.Timedelta('365 days')

df['col'] + pd.Timedelta('-365 days')

相关问题