找到月底Pandas DataFrame系列

时间:2016-05-20 19:02:32

标签: python date datetime pandas

我在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,日期时间为dt

4 个答案:

答案 0 :(得分:52)

您可以使用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)等。这应该适用于任何一个月,所以你不需要知道这个月的天数,或者这样的事情。可以在documentation中找到更多偏移信息。

示例用法和输出:

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

答案 1 :(得分:24)

同意root offer是正确的方法。但是,盲目使用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') 代替:

cmd

答案 2 :(得分:1)

使用dateutil.relativedelta。然后在该月的第一天添加相对增量。

import dateutil.relativedelta as rd

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

得到你:

datetime.date(2001, 4, 30)

答案 3 :(得分:0)

根据用例所需的offset,月末可以是该月的最后一天/分钟/秒/毫秒/微秒/纳秒。给定日期,要导出该月的最后一个单位,请使用适用的anchored offset semantics。例如:

import pandas as pd

def last_second_of_month(date: str) -> str:
    return str(pd.Timestamp(date) + pd.offsets.MonthBegin() - pd.offsets.Second())

根据需要,将上方的Second()替换为Day()Minute()Milli()Micro()Nano()

这是结果相同的替代实现:

import pandas as pd

def last_second_of_month(date: str) -> str:
    return str((pd.Timestamp(date) + pd.offsets.MonthEnd(0)).date()) + " 23:59:59"

示例:

>>> last_second_of_month('2020-10')
'2020-10-31 23:59:59'
>>> last_second_of_month('2020-10-01')
'2020-10-31 23:59:59'
>>> last_second_of_month('2020-10-15')
'2020-10-31 23:59:59'
>>> last_second_of_month('2020-10-30')
'2020-10-31 23:59:59'
>>> last_second_of_month('2020-10-31')
'2020-10-31 23:59:59'

请注意,请勿使用 pd.Timestamp(date) + pd.offsets.MonthEnd() + pd.offsets.Day() - pd.offsets.Second(),因为它在一个月的最后日期无法正常工作。关于pd.offsets.MonthEnd(1)的观察结果归功于answer by Martien