找到月底Pandas DataFrame系列

Lis*_*sle 39 python datetime date pandas

我在最初作为对象读取的DataFrame中有一个系列,然后需要将其转换为yyyy-mm-dd形式的日期,其中dd是月末.

作为一个例子,我有DataFrame df,其中Date作为对象列:

...      Date    ...
...     200104   ...
...     200508   ...
Run Code Online (Sandbox Code Playgroud)

当这一切都说完了,我想要的是一个日期对象:

...      Date    ...
...  2001-04-30  ...
...  2005-08-31  ...
Run Code Online (Sandbox Code Playgroud)

这样df ['Date'].item()返回

datetime.date(2001, 04, 30)
Run Code Online (Sandbox Code Playgroud)

我已经使用以下代码几乎到了那里,但我所有的日期都是在月初,而不是结束.请指教.

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m").dt.date
Run Code Online (Sandbox Code Playgroud)

注意:我已经导入了Pandas ad pd,日期时间为dt

roo*_*oot 73

你可以使用pandas.tseries.offsets.MonthEnd:

from pandas.tseries.offsets import MonthEnd

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

1MonthEnd刚刚指定向前移动一步,这是一个月末的下一个日期.(使用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
Run Code Online (Sandbox Code Playgroud)

  • 正如 [Martein 的回答](/sf/answers/3022427131/) 中所解释的,使用 `MonthEnd(1)` 对于一个月的最后一个日期是不正确的,它应该始终是 `改为 MonthEnd(0)`。 (5认同)
  • 没问题!“MonthEnd”是隐藏在 Pandas 中的瑰宝之一,你不会立即想到 Pandas 会拥有它。通常我的第一直觉是使用其他日期时间库......直到我记得 Pandas 有如此酷的功能! (2认同)
  • 你应该查看@martien lubberink的回答,以了解上述内容. (2认同)
  • 有人可以编辑答案吗?如上所述,我们应该使用 ```MonthEnd(0)``` 而不是 ```MonthEnd(1)```。这个问题很常见,而且答案错误,因为评分最高的问题会误导人们。 (2认同)

Mar*_*ink 33

同意根提供是正确的方法.但是,盲人使用的读者 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')
Run Code Online (Sandbox Code Playgroud)

使用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')
Run Code Online (Sandbox Code Playgroud)