Python 从表中的日期时间列中减去一年

Python 从表中的日期时间列中减去一年,python,pandas,datetime,Python,Pandas,Datetime,我有一个datetime列,如下所示- >>> 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

我有一个datetime列,如下所示-

>>> 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

您可以使用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))
您可以使用来实现这一点:

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
使用:

如果有对象而不是列

  • 使用
    pd.DateOffset(years=n)
    并不理想,因为它会产生:
  • UserWarning:在转换中丢弃非零纳秒

  • pd.Timedelta()
    不接受年份
  • 在这种情况下,唯一对我有效的方法是:


    这是在中暗示的,但需要进一步澄清。

    我很好奇,当你的起始日期是2月29日时它会做什么?@Markransem好问题我刚刚尝试了这个,因为
    2004-02-29
    减去一年就变成了
    2003-02-28
    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
    
    t = pd.Timestamp.now()
    t = t.replace(year=t.year - n)