Python Pandas data_range

#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]