#python #pandas #date
#python #панды #Дата
Вопрос:
Я пытаюсь получать каждый месяц между заданным диапазоном дат, используя функцию data_range в pandas. Однако, если я установлю конечную дату в качестве последней даты месяца, это вернет мне дополнительный месяц. Как я могу это исправить?
[In]: pd.date_range(*(pd.to_datetime(['01/01/2020', '03/30/2020']) pd.offsets.MonthEnd()), freq='M')
Это не возвращает никаких проблем:
[Out]: DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31'], dtype='datetime64[ns]', freq='M')
Однако, если я изменю конечную дату на ’03/31/2020′, она возвращает:
[Out]: DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30'], dtype='datetime64[ns]', freq='M')
То, что я ищу, — это заставить оба ’01/01/2020′ по ’03/30/2020′ и ’01/01/2020′ по ’03/31/2020′ возвращать один и тот же результат, который [‘2020-01-31’, ‘2020-02-29’, ‘2020-03-31’].
Спасибо.
Ответ №1:
Используйте pd.offsets.MonthEnd(0)
вместо этого, это решит вашу проблему:
pd.date_range(*(pd.to_datetime(['01/01/2020', '03/31/2020']) pd.offsets.MonthEnd(0)), freq='M')
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31'], dtype='datetime64[ns]', freq='M')
На мой взгляд, более чистым решением является использование повторной выборки:
rng = pd.date_range(*(pd.to_datetime(['01/01/2020', '03/31/2020'])), freq='M')
rng.to_series().resample('M').last()
2020-01-31 2020-01-31
2020-02-29 2020-02-29
2020-03-31 2020-03-31
Freq: M, dtype: datetime64[ns]