11

考虑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')

我想以附加到对象的频率将索引延长一个周期。


我预计

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')

我试过了

dates.append(dates[[-1]] + pd.offsets.BusinessMonthEnd())

然而

  • 未概括为使用频率dates
  • 我收到性能警告

    PerformanceWarning:将非矢量化 DateOffset 应用于 Series 或 DatetimeIndex

4

5 回答 5

10

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')

您可以使用以下命令将后者添加到您的索引中.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')

与 相比.append,这保留了偏移量的知识。

于 2016-09-15T17:28:32.170 回答
6

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))

学分

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

什么没用

  • 以下刚刚被格式化为一个Index,而不是一个DateTimeIndexdates.union([dates[-1] + dates.freq])
  • dates[-1] + 1已弃用。
于 2021-02-15T11:21:49.467 回答
5

最好的解决方案是:

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

其中 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')
于 2021-02-19T11:16:44.700 回答
1

试试这个:

In [207]: dates = dates.append(pd.DatetimeIndex(pd.Series(dates[-1] + pd.offsets.BusinessMonthEnd())))

In [208]: dates
Out[208]: DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29', '2016-05-31'], dtype='datetime64[ns]', freq=None)

或使用list( [...]) 代替pd.Series()

In [211]: dates.append(pd.DatetimeIndex([dates[-1] + pd.offsets.BusinessMonthEnd()]))
Out[211]: DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29', '2016-05-31'], dtype='datetime64[ns]', freq=None)
于 2016-09-15T17:19:30.013 回答
0

我会使用该.tshift功能,然后相应地使用:

dr = pd.date_range(start='1/1/2020', periods=5, freq='D')
df = pd.DataFrame(data=[1,2,3,4,5], 
                  index=dr,
                  columns=['A'])
df.head()
            A
2020-01-01  1
2020-01-02  2
2020-01-03  3
2020-01-04  4
2020-01-05  5 <-

df.tshift()
            A
2020-01-02  1
2020-01-03  2
2020-01-04  3
2020-01-05  4
2020-01-06  5 <-

other = pd.DataFrame([6], columns=['A'], index=[df.tshift().index[-1]])
other.head()
            A
2020-01-06  6

df.append(other)
            A
2020-01-01  1
2020-01-02  2
2020-01-03  3
2020-01-04  4
2020-01-05  5
2020-01-06  6 <-
于 2020-06-11T17:41:20.450 回答