问题:使用pandas.to_datetime时仅保留日期部分
我pandas.to_datetime
用来解析数据中的日期。默认情况下,熊猫代表日期,datetime64[ns]
即使所有日期都是每天也是如此。我想知道是否存在一种优雅/巧妙的方法来将日期转换为datetime.date
或,datetime64[D]
以便当我将数据写入CSV时,日期不附加00:00:00
。我知道我可以手动逐个元素地转换类型:
[dt.to_datetime().date() for dt in df.dates]
但这确实很慢,因为我有很多行,这有点违反了使用目的pandas.to_datetime
。有没有一种方法可以一次转换dtype
整个列?或者,是否pandas.to_datetime
支持精度规范,以便在处理日常数据时可以省去时间部分?
回答 0
从版本开始,0.15.0
现在可以轻松地通过.dt
仅访问日期组件来完成此操作:
df['just_date'] = df['dates'].dt.date
上面的方法返回一个datetime.date
dtype,如果您想要一个a,datetime64
则可以normalize
将时间分量设置为午夜,以便将所有值设置为00:00:00
:
df['normalised_date'] = df['dates'].dt.normalize()
这会使dtype保持不变,datetime64
但显示屏仅显示该date
值。
回答 1
简单的解决方案:
df['date_only'] = df['date_time_column'].dt.date
回答 2
虽然我赞成EdChum的答案,这是对OP提出的问题的最直接答案,但它并不能真正解决性能问题(它仍然依赖于python datetime
对象,因此对它们的任何操作都不会被矢量化-即,它会很慢)。
性能更好的替代方法是使用df['dates'].dt.floor('d')
。严格来说,它不会“仅保留日期部分”,因为它只是将时间设置为00:00:00
。但是它确实可以按OP的要求运行,例如:
- 打印到屏幕
- 保存到csv
- 使用列来
groupby
…并且效率更高,因为该操作已矢量化。
编辑:其实,在OP的宁愿答案很可能是“最近的版本pandas
也没有时间写为csv如果是00:00:00
对所有的意见”。
回答 3
回答 4
熊猫v0.13 +: 与date_format
参数一起使用
尽可能避免将您的datetime64[ns]
系列转换为object
dtype系列的datetime.date
对象。后者通常使用构造pd.Series.dt.date
,存储为指针数组,相对于基于NumPy的纯序列而言效率低下。
由于在写入CSV时您关注的是格式,因此只需使用date_format
参数to_csv
。例如:
df.to_csv(filename, date_format='%Y-%m-%d')
有关格式设置约定,请参见Python的strftime
指令。
回答 5
这是提取日期的简单方法:
import pandas as pd
d='2015-01-08 22:44:09'
date=pd.to_datetime(d).date()
print(date)
回答 6
转换为datetime64[D]
:
df.dates.values.astype('M8[D]')
尽管将其重新分配给DataFrame col将其恢复为[ns]。
如果您想要实际的datetime.date
:
dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])
回答 7
如果有人看到此旧帖子,请给出一个最新的答案。
转换为日期时间时添加“ utc = False”将删除时区部分,仅将日期保留为datetime64 [ns]数据类型。
pd.to_datetime(df['Date'], utc=False)
您将能够将其保存在excel中,而不会出现错误“ ValueError:Excel不支持带时区的日期时间。在写入Excel之前,请确保日期时间不知道时区。”
回答 8
我希望能够更改数据框中一组列的类型,然后删除保持一天的时间。round(),floor(),ceil()全部工作
df[date_columns] = df[date_columns].apply(pd.to_datetime)
df[date_columns] = df[date_columns].apply(lambda t: t.dt.floor('d'))