从熊猫的日期时间列中减去一年

Posted

技术标签:

【中文标题】从熊猫的日期时间列中减去一年【英文标题】: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

【问题讨论】:

【参考方案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 对象而不是一个列,

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

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

    pd.Timedelta() 不接受年份。

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

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

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

【讨论】:

以上是关于从熊猫的日期时间列中减去一年的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫的日期时间列中提取日期和小时[重复]

如何从 Pandas 数据框列中的日期时间减去 3 小时?

熊猫:仅从日期时间列中提取日历年

熊猫从日期范围列中提取开始和结束日期[重复]

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

如何从 MS SQL 表中具有 MM/DD/YYYY 日期的单个列中减去