Найти конец месяца Pandas Серия DataFrame

У меня есть серия в DataFrame, которую я сначала читал как объект, а затем нужно преобразовать ее в дату в виде yyyy-mm-dd, где dd - конец месяца.

В качестве примера у меня есть DataFrame df с столбцом Date в качестве объекта:

...      Date    ...
...     200104   ...
...     200508   ...

Что я хочу, когда все это сказано и сделано, является объектом даты:

...      Date    ...
...  2001-04-30  ...
...  2005-08-31  ...

так что df ['Date']. item() возвращает

datetime.date(2001, 04, 30)

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

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m").dt.date

Примечание. Я уже импортировал Pandas ad pd и datetime как dt

Ответ 1

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

from pandas.tseries.offsets import MonthEnd

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1)

1 в MonthEnd просто указывает переход на один шаг вперед к следующей дате окончания месяца. (Используя 0 или оставить его пустым, также будет работать в вашем случае). Если вы хотите в последний день следующего месяца, вы должны использовать MonthEnd(2) и т.д. Это должно работать в течение любого месяца, поэтому вам не нужно знать число дней в месяце или что-то в этом роде. Более подробную информацию о смещении можно найти в документации .

Пример использования и вывода:

df = pd.DataFrame({'Date': [200104, 200508, 201002, 201602, 199912, 200611]})
df['EndOfMonth'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1)

     Date EndOfMonth
0  200104 2001-04-30
1  200508 2005-08-31
2  201002 2010-02-28
3  201602 2016-02-29
4  199912 1999-12-31
5  200611 2006-11-30

Ответ 2

Согласовано, что корневые предложения являются правильным методом. Однако читатели, которые слепо используют MonthEnd(1), удивляются, если они используют последнюю дату месяца в качестве ввода:

In [4]: pd.Timestamp('2014-01-01')+MonthEnd(1)
Out[4]: Timestamp('2014-01-31 00:00:00')

In [5]: pd.Timestamp('2014-01-31')+MonthEnd(1)
Out[5]: Timestamp('2014-02-28 00:00:00')

Использование MonthEnd(0) вместо этого дает следующее:

In [7]: pd.Timestamp('2014-01-01')+MonthEnd(0)
Out[7]: Timestamp('2014-01-31 00:00:00')

In [8]: pd.Timestamp('2014-01-31')+MonthEnd(0)
Out[8]: Timestamp('2014-01-31 00:00:00')

Ответ 3

используйте dateutil.relativedelta. Затем добавьте относительную дельта к первому из месяца.

import dateutil.relativedelta as rd

datetime.date(2001, 4, 1) + rd.relativedelta(day=31)

получает вас:

datetime.date(2001, 4, 30)