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)
然而
datesPerformanceWarning:应用于Series或DatetimeIndex的非向量化DateOffset
您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,这保留了偏移的知识.
为了跟进这个问题,pandas==1.1.1我发现这是最好的解决方案:
dates.union(pd.date_range(dates[-1] + dates.freq, periods=1, freq=dates.freq))
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 的评论。
Index,而不是 a DateTimeIndex:
dates.union([dates[-1] + dates.freq])dates[-1] + 1已弃用。最好的解决方案是:
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)