从熊猫的日期时间列中减去一年
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 暗示了这一点,但需要进一步澄清。
【讨论】:
以上是关于从熊猫的日期时间列中减去一年的主要内容,如果未能解决你的问题,请参考以下文章