从日期时间列中提取 YYYY-MM

Posted

技术标签:

【中文标题】从日期时间列中提取 YYYY-MM【英文标题】:Extracting YYYY-MM from datetime column 【发布时间】:2018-11-28 03:40:46 【问题描述】:

我有一个这种格式的数据框 -

var1  date
A     2017/01/01
A     2017/01/02
...

我希望将日期转换为 YYYY-MM 格式,但 df['date'].dtypeobject。 如何在将数据类型保持为日期时间的同时从日期中删除日期部分?

预期输出 -

A - 2017/01

谢谢

【问题讨论】:

您需要先解析当前日期 - 读取 csv 文件时有一个 parse_dates 参数。然后您可以转换为您想要的任何输出。或者,只需使用 lambda 函数 df.date.apply(lambda x: x[0:4] + "/" + x[4:5]) How can I remove the day part from date while keeping the data type as datetime?。这不可能。就像在现实生活中一样,每个日期都有一天。选择您想要的:字符串(包含您喜欢的任何组件)或日期时间(包含所有组件,即使它们不是全部显示)。 @jpp,我们可以使用period dtype 作为datetimeobject dtypes 之间的折衷... @MaxU,公平点。感谢您以有效的妥协重新打开 :) 【参考方案1】:

可以将每个日期替换为每月的第一天:

pd.to_datetime(d["date"], format="%Y/%m/%d").apply(lambda x: x.replace(day=1))

结果

0 2017-01-01
1 2017-01-01

【讨论】:

dtype 是对象。我需要它作为日期时间 恐怕这并不能回答问题,这需要妥协。 datetime 对象不能“删除”日期。【参考方案2】:

datetime dtype 不能有自定义表示。但您有以下选择:

    使用字符串 - 您可能有任何表示形式(如您所愿),但所有日期时间方法和属性都会丢失 使用datetime,但将day 部分设置为1(如@Kopytok 所示)。 使用period dtype,它仍然允许您使用一些日期算术

演示:

In [207]: df
Out[207]:
  var1       date
0    A 2018-12-31
1    A 2017-09-07
2    B 2016-02-29

In [208]: df['new'] = df['date'].dt.to_period('M')

In [209]: df
Out[209]:
  var1       date     new
0    A 2018-12-31 2018-12
1    A 2017-09-07 2017-09
2    B 2016-02-29 2016-02

In [210]: df.dtypes
Out[210]:
var1            object
date    datetime64[ns]
new             object
dtype: object

In [211]: df['new'] + 8
Out[211]:
0   2019-08
1   2018-05
2   2016-10
Name: new, dtype: object

【讨论】:

以上是关于从日期时间列中提取 YYYY-MM的主要内容,如果未能解决你的问题,请参考以下文章

从日期时间列中提取日期 - SQL Server Compact

从 oracle-sql 中的时间戳日期列中提取日期

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

如何从 H2 中的时间戳列中提取日期

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

为啥我不能从我的 DataFrame 中的“日期”列中提取月份的列? [复制]