熊猫:仅从日期时间列中提取日历年

Posted

技术标签:

【中文标题】熊猫:仅从日期时间列中提取日历年【英文标题】:Pandas: Extracting just the Calendar Year from Datetime column 【发布时间】:2016-07-27 10:22:06 【问题描述】:

我有一个数据框,其中有一列类似于以下列:

df['Schedule'] =
...
2012-12-31
2013-01-01
2013-01-02
2013-01-03
2013-01-04
2013-01-05
2013-01-06
2013-01-07
2013-01-08
2013-01-09

从1981年到2015年等等。列的元素是pandas.tslib.Timestamp。

我需要创建另一个列,我只需要提取年份。

所以我做了以下命令:

df['Year'] = df['Schedule'].dt.year

它部分有效,因为我需要年份与日历年的日期相匹配(我的数据集由 NBA 赛季的比赛组成)/ 要清楚,而不是:

2012-12-31    2012
2013-01-01    2013

我需要:

2012-12-31    2013
2013-01-01    2013
...
2013-09-27    2014
...
2014-04-06    2014    

有没有人有有效的方法来解决这个问题?

【问题讨论】:

月份如何与季节对应? 我的观察(输入)都是从1981年到2015年的比赛。每个赛季的开始时间是10月左右,常规赛(季后赛前)在4月中旬结束。所以相关月份如下:09,10,11,12,01,02,03,04。希望对你有帮助 【参考方案1】:

根据你的说法,9 月似乎是 NBA 赛季的转折点。如果是这样,您最好的选择是 apply 自定义 lambda,就像这样:

df["year"] = df["schedule"].apply (lambda x : x.year if x.month < 9 else x.year + 1)

如果你给我更多关于 NBA 赛季月份的信息,我可以清理一下。

这是一个为您的样本产生正确输出的测试程序:

import dateutil

df = DataFrame (
    "schedule" :
    Series ([
        "2012-12-31",
        "2013-01-01",
        "2013-09-27",
        "2014-04-06"
    ]).apply(dateutil.parser.parse)
)
df["year"] = df["schedule"].apply (lambda x : x.year if x.month < 9 else x.year + 1)
df

Here 是 pandas 文档首先开始介绍使用 lambda 函数和 apply 的地方之一。

【讨论】:

为了给你更多信息,我的数据集由常规赛赛程(从 10 月到 4 月中旬)组成。您的代码听起来不错,但为什么“.apply(dateutil.parser.parse)”? 感谢接受。 .apply(dateutil.parser.parse) 只是设置示例数据以使 schedule 列变为 datetime 类型,我认为这也是您原始数据集列的类型。 是的!感谢您的帮助。

以上是关于熊猫:仅从日期时间列中提取日历年的主要内容,如果未能解决你的问题,请参考以下文章

我们如何仅从 Oracle 中具有各种日期和字符串格式的列中提取日期?

熊猫从日期范围列中提取开始和结束日期[重复]

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

如何从熊猫数据框中提取日期/年份/月份?

仅从时刻对象中提取日期

在熊猫中传播范围日期