Я хотел бы начать с месяца 2019-01, а затем добавить любое количество последовательных месяцев и использовать его в качестве индекса в кадре данных панд. Я нашел предложения, которые указывают на использование pd.to_timedelta, но я продолжаю сталкиваться с проблемами.

Вот подробности:

Если вы начнете с даты и добавите 5 периодов, как это:

import pandas as pd
import numpy as np

date = pd.to_datetime("1st of Jan, 2019")
dates = date+pd.to_timedelta(np.arange(5), 'M')

Тогда вы получите:

DatetimeIndex(['2019-01-01 00:00:00', '2019-01-31 10:29:06',
               '2019-03-02 20:58:12', '2019-04-02 07:27:18',
               '2019-05-02 17:56:24'],
              dtype='datetime64[ns]', freq=None)

Вы можете легко удалить части дня и времени, а также удалить дубликаты для обработки двойных 2019-01, например так:

dates = dates.map(lambda x: x.strftime('%Y-%m'))
dates = dates.drop_duplicates()

Но, как вы можете видеть, 2019-02 отсутствует:

Index(['2019-01', '2019-03', '2019-04', '2019-05'], dtype='object')

Какой лучший способ сделать это?

0
vestland 14 Сен 2018 в 12:55

2 ответа

Лучший ответ

Вы можете использовать pandas.date_range :

pd.date_range(date, periods=5, freq='M').strftime('%Y-%m')

[вне]

Index(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05'], dtype='object')
3
Chris A 14 Сен 2018 в 10:04

Вы можете создать PeriodIndex с помощью period_range :

dates = pd.period_range(date, periods=5, freq='M')
print (dates)
PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05'], 
            dtype='period[M]', freq='M')

Ваше решение должно работать, если добавить 2 дня:

dates = (date + pd.to_timedelta(np.arange(5), unit='M') + pd.Timedelta(2, unit='d')).strftime('%Y-%m')

print (dates)
Index(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05'], dtype='object')

Убедитесь, что:

dates = (date + pd.to_timedelta(np.arange(120), unit='M') + pd.Timedelta(2, unit='d'))
        .month.value_counts()

print (dates)

12    10
11    10
10    10
9     10
8     10
7     10
6     10
5     10
4     10
3     10
2     10
1     10
dtype: int64
3
jezrael 14 Сен 2018 в 10:13