我在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
答案 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。