Pandas to_timedelta возврат несогласованных значений - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь сделать что-то очень простое, у меня есть DatetimeIndex в наборе данных, и я хочу сохранить последние 12 месяцев только на основе самой последней записи.

Мои данные: AU, содержит один запись по месяцу, и дата всегда является первым днем ​​месяца.

Теперь, когда я делаю это:

mask = au.index >= max(au.index) - pd.to_timedelta(12, unit = 'M')
pd.unique(au[mask].index)

Out[5]: 
array(['2018-11-01T00:00:00.000000000', '2018-12-01T00:00:00.000000000',
       '2019-11-01T00:00:00.000000000', '2019-10-01T00:00:00.000000000',
       '2019-09-01T00:00:00.000000000', '2019-08-01T00:00:00.000000000',
       '2019-07-01T00:00:00.000000000', '2019-06-01T00:00:00.000000000',
       '2019-01-01T00:00:00.000000000', '2019-05-01T00:00:00.000000000',
       '2019-04-01T00:00:00.000000000', '2019-03-01T00:00:00.000000000',
       '2019-02-01T00:00:00.000000000'], dtype='datetime64[ns]')

Я получаю мой последний месяц и последние двенадцать месяцев, так что 13 месяцев в целом. Это нормально, я подумал, что это был просто вопрос, включать или не включать расчет за последний месяц.

Поэтому я изменяю свой код на:

mask = au.index >= max(au.index) - pd.to_timedelta(11, unit = 'M')
pd.unique(au[mask].index)

Out[9]: 
array(['2019-11-01T00:00:00.000000000', '2019-10-01T00:00:00.000000000',
       '2019-09-01T00:00:00.000000000', '2019-08-01T00:00:00.000000000',
       '2019-07-01T00:00:00.000000000', '2019-06-01T00:00:00.000000000',
       '2019-01-01T00:00:00.000000000', '2019-05-01T00:00:00.000000000',
       '2019-04-01T00:00:00.000000000', '2019-03-01T00:00:00.000000000',
       '2019-02-01T00:00:00.000000000'], dtype='datetime64[ns]')

Теперь я получаю только 11 месяцев назад вместо 12, как и ожидалось.

Кто-нибудь знает почему?

Спасибо

PS: Я понимаю, что, вероятно, был бы способ сделать это с использованием относительной дельты. Но мне любопытно понять поведение pandas.

1 Ответ

0 голосов
/ 13 февраля 2020

Спасибо @Quang Huong, с помощью этого я решил мою проблему:

mask = au.index >= max(au.index) + pd.DateOffset(months=-2)
...