Продлить индекс datetimeindex на 1 период

Рассмотреть DateTimeIndexdates

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

5 ответов

Решение

Отметки времени в вашем 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это сохраняет знание о смещении.

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, а не 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:])

где 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')

Попробуй это:

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)

Я бы использовал .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 <-
Другие вопросы по тегам