【问题标题】:Subtract a year from a datetime column in pandas从熊猫的日期时间列中减去一年
【发布时间】:2015-09-19 02:37:35
【问题描述】:

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

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

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    你可以使用 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))
    

    【讨论】:

      【解决方案2】:

      您可以使用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
      

      【讨论】:

      • 我很好奇,如果你的开始日期是 2 月 29 日,它会做什么?
      • @MarkRansom 好问题我刚试过这个,因为2004-02-29 减去一年变成2003-02-28
      【解决方案3】:

      使用DateOffset:

      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
      

      【讨论】:

      • 请问pd.DateOffset(years=1)和你的pd.offsets.DateOffset(years=1)有什么区别?
      • @ahbon 如果使用 plural years 则添加 1 年,如果使用 singular year 则设置为年份 1
      【解决方案4】:

      如果有一个pd.Timestamp 对象而不是一个列,

      1. 使用pd.DateOffset(years=n) 并不理想,因为它会产生:

      UserWarning:在转换中丢弃非零纳秒

      1. pd.Timedelta() 不接受年份。

      在这种情况下,唯一对我有用的方法是pd.Timestamp.replace

      t = pd.Timestamp.now()
      t = t.replace(year=t.year - n)
      

      answer by Padriac 暗示了这一点,但需要进一步澄清。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-15
        • 2019-05-20
        • 2020-12-30
        • 2017-11-19
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多