Pandas,在数据框中将日期时间列加一个月的简单方法

3
作为之前问题的补充,关于在两个日期时间之间计算活动次数,这里有一个很好的解答:创建一个跨越日期范围的 Pandas 数据帧并计算项目数量
剩下的问题是,在两个表相加和相减后,最终月份 ['END_DATE'] 的值显示为零。从数学上讲这是正确的,因为所有项目的结束日期在当前月或之前,然而在这种情况下,由于它们在该月份内至少活动了一部分,更正确的做法是将 END_DATE 加 1 个月,这样它们将显示为活动在结束月份(H2 是一个数据帧)。
代码如下:
ends = H2['END_DATE'].apply(lambda t: t.to_period(freq='m')).value_counts()

我曾试过使用rollforward和DateOffset(month=1)等方法。例如,对于DateOffset:

ends = (H2['END_DATE'].DateOffset(months=1)).apply(lambda t: t.to_period(freq='m')).value_counts()

这让我遇到了这个错误:

AttributeError: 'Series' object has no attribute 'DateOffset'

你是想将日期向前或向后移动一个月吗? - Andy Hayden
是的,我是这样做的,这样结束的月份将比现在大一个,这样“最后”一个月就会被计算,而不会变成零。 - dartdog
1个回答

4
最简单的方法是将PeriodIndex加上一个月:
In [21]: ends
Out[21]:
2000-05    1
2000-09    1
2001-06    1
Freq: M, dtype: int64

In [22]: ends.index = ends.index + 1

In [23]: ends
Out[23]:
2000-06    1
2000-10    1
2001-07    1
Freq: M, dtype: int64

我的初步建议是在重新索引之后进行转换(因为您无论如何都要这样做):

In [11]: ends
Out[11]:
2000-05    1
2000-09    1
2001-06    1
Freq: M, dtype: int64

In [12]: p = pd.PeriodIndex(freq='m', start='2000-1', periods=19)  # Note: needs to be one more than before

In [13]: sparse_ends = ends.reindex(p)

In [14]: sparse_ends.shift(1)
Out[14]:
2000-01   NaN
2000-02   NaN
2000-03   NaN
2000-04   NaN
2000-05   NaN
2000-06     1
2000-07   NaN
2000-08   NaN
2000-09   NaN
2000-10     1
2000-11   NaN
2000-12   NaN
2001-01   NaN
2001-02   NaN
2001-03   NaN
2001-04   NaN
2001-05   NaN
2001-06   NaN
2001-07     1
Freq: M, dtype: float64

谢谢,那可能行得通,但是没有一种简单的方法只是添加一个月到 ['END_DATE'] 吗? - dartdog
移位索引看起来是一个更好的修复方法,但我仍然想知道是否有一个简单的日期添加函数,就像在SQL中那样,可以应用吗? - dartdog
我看到了,我很喜欢。但我仍然想知道是否有一个简单的DateAdd类型函数可供使用,如果需要还可以在其他地方使用? - dartdog
@dartdog 啊,是要将日期作为值添加到Series中吗?(我认为不是,这是针对DatetimeIndex的,应该同样适用于series) - Andy Hayden
要澄清一下,问题是要使DatetimeIndex中的日期时间助手可用于具有日期时间值的Series。 - Andy Hayden
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接