从日期时间列中提取 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'].dtype
是 object
。
如何在将数据类型保持为日期时间的同时从日期中删除日期部分?
预期输出 -
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 作为datetime
和object
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的主要内容,如果未能解决你的问题,请参考以下文章