将pandas datetimeindex延长1个周期

piR*_*red 6 python pandas datetimeindex

考虑一下 DateTimeIndex dates

dates = pd.date_range('2016-01-29', periods=4, freq='BM')
dates

DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29'],
              dtype='datetime64[ns]', freq='BM')
Run Code Online (Sandbox Code Playgroud)

我想在附加到对象的频率上将索引扩展一个句点.


我预计

pd.date_range('2016-01-29', periods=5, freq='BM')

DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',
               '2016-05-31'],
              dtype='datetime64[ns]', freq='BM')
Run Code Online (Sandbox Code Playgroud)

我试过了

dates.append(dates[[-1]] + pd.offsets.BusinessMonthEnd())
Run Code Online (Sandbox Code Playgroud)

然而

  • 不推广使用频率 dates
  • 我得到了一个性能警告

    PerformanceWarning:应用于Series或DatetimeIndex的非向量化DateOffset

Alb*_*oso 9

DatetimeIndex已经知道他们描述业务月结束的时间戳,所以您只需添加1:

import pandas as pd
dates = pd.date_range('2016-01-29', periods=4, freq='BM')

print(repr(dates[-1]))
# => Timestamp('2016-04-29 00:00:00', offset='BM')

print(repr(dates[-1] + 1))
# => Timestamp('2016-05-31 00:00:00', offset='BM')
Run Code Online (Sandbox Code Playgroud)

您可以使用.union以下命令将后者添加到索引:

dates = dates.union([dates[-1] + 1])
print(dates)
# => DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',
#                   '2016-05-31'],
#                  dtype='datetime64[ns]', freq='BM')
Run Code Online (Sandbox Code Playgroud)

相比之下.append,这保留了偏移的知识.

  • 现在已弃用。不推荐对时间戳进行整数和整数数组的加/减操作,并将在未来版本中删除。使用“n * self.freq”,而不是添加/减去“n” (4认同)

dyl*_*oll 7

pandas==1.1.1 答案+1

为了跟进这个问题,pandas==1.1.1我发现这是最好的解决方案:

dates.union(pd.date_range(dates[-1] + dates.freq, periods=1, freq=dates.freq))

使用 n 的广义答案

n=3
dates.union(pd.date_range(dates[-1] + dates.freq, periods=n, freq=dates.freq))
Run Code Online (Sandbox Code Playgroud)

制作人员

结合@alberto-garcia-raboso 的回答和@ballpointben 的评论。

什么不起作用

  • 以下内容刚刚被格式化为 an Index,而不是 a DateTimeIndexdates.union([dates[-1] + dates.freq])
  • dates[-1] + 1已弃用。


fcc*_*lho 7

最好的解决方案是:

import pandas as pd
dates = pd.date_range('2016-01-29', periods=4, freq='BM')
extended = dates.union(dates.shift(n)[-n:])
Run Code Online (Sandbox Code Playgroud)

其中 n 是要添加的周期数。使用n=4,您将获得如下所示的扩展日期范围:

DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',
               '2016-05-31', '2016-06-30', '2016-07-29', '2016-08-31'],
              dtype='datetime64[ns]', freq='BM')
Run Code Online (Sandbox Code Playgroud)