使用pandas.to_datetime时仅保留日期部分

153 python csv datetime series pandas

pandas.to_datetime用来解析数据中的日期.Pandas默认表示日期,datetime64[ns]即使日期仅为每日日期.我想知道是否有一种优雅/巧妙的方式将日期转换为datetime.date或者datetime64[D]当我将数据写入CSV时,日期不会附加00:00:00.我知道我可以逐个元素地手动转换类型:

[dt.to_datetime().date() for dt in df.dates]
Run Code Online (Sandbox Code Playgroud)

但这真的很慢,因为我有很多行,这有点挫败了使用的目的pandas.to_datetime.有没有办法立即转换dtype整个列?或者,是否pandas.to_datetime支持精度规范,以便在处理日常数据时可以摆脱时间部分?

EdC*_*ica 212

从版本开始,0.15.0现在.dt只需访问日期组件即可轻松完成:

df['just_date'] = df['dates'].dt.date
Run Code Online (Sandbox Code Playgroud)

上面返回一个datetime.datedtype,如果你想拥有一个datetime64那么你可以只normalize将时间组件设置为午夜,所以它将所有值设置为00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()
Run Code Online (Sandbox Code Playgroud)

这样可以保持dtype,datetime64但显示只显示date值.

  • 不幸的是``df ['just_date']``然后有``object`` dtype(例如没有``.dt``访问者)...有什么办法可以避免这种情况吗? (13认同)
  • 只能将 .dt 访问器与类似日期时间的值一起使用 (6认同)
  • @PietroBattiston这意味着它可能仍然是一个字符串,尝试首先转换`df ['just_date'] = pd.to_datetime(df ['just_date'])`你可能需要将`format` arg传递给`to_datetime`如果它可以不推断格式 (4认同)
  • 这个df ['dates'].dt.floor('d')<----将日期保存为日期格式而不是对象.希望这有助于某人......正如下面的@ pietro-battiston所回答的那样.还有ser.dt.normalize()<---这个有效. (4认同)
  • @ihightower你也可以``df ['dates'].dt.normalize()`将时间标准化为午夜,OP之后的是不将时间组件写入csv (2认同)

Pie*_*ton 23

虽然我赞同EdChum的答案,这是对OP提出的问题的最直接的答案,但它并没有真正解决性能问题(它仍然依赖于python datetime对象,因此对它们的任何操作都不会被矢量化 - 也就是说,它会很慢).

更好的替代方案是使用df['dates'].dt.floor('d').严格地说,它不是"仅保留日期部分",因为它只是设置时间00:00:00.但它确实可以通过OP工作,例如:

  • 打印到屏幕
  • 保存到csv
  • 使用列来 groupby

...而且效率更高,因为操作是矢量化的.

编辑:其实,在OP的宁愿答案很可能是"的最新版本pandas没有写入到csv,如果它是时间00:00:00的所有观测值".


Pal*_*ine 18

df['Column'] = df['Column'].dt.strftime('%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud)

这只会为您提供所需格式的日期,而不是时间。您可以根据需要更改格式'%m/%d/%Y'。它将把列的数据类型更改为'object'.


如果您只想要日期而不想要时间格式,YYYY-MM-DD请使用:

df['Column'] = pd.to_datetime(df['Column']).dt.date
Run Code Online (Sandbox Code Playgroud)

数据类型将为'object'.


对于'datetime64'数据类型,请使用:

df['Column'] = pd.to_datetime(df['Column']).dt.normalize()
Run Code Online (Sandbox Code Playgroud)


j08*_*lue 15

熊猫DatetimeIndexSeries一个叫做的方法normalize完全符合你的要求.

您可以在此答案中阅读更多相关信息.

它可以用作 ser.dt.normalize()


Gil*_*gio 13

简单的解决方案:

df['date_only'] = df['date_time_column'].dt.date
Run Code Online (Sandbox Code Playgroud)

  • 只是警告,这会将类型更改为对象。因此,您需要 astype('datetime64') 以保持一致性。 (28认同)

Kat*_*rin 10

只是给出一个更新的答案,以防有人看到这个旧帖子。

在转换为 datetime 时添加“utc=False”将删除时区组件并仅保留 datetime64[ns] 数据类型的日期。

pd.to_datetime(df['Date'], utc=False)
Run Code Online (Sandbox Code Playgroud)

您将能够将其保存在 excel 中而不会出现错误“ValueError:Excel 不支持带时区的日期时间。在写入 Excel 之前,请确保日期时间是不知道时区的。”

在此处输入图片说明


jpp*_*jpp 8

熊猫v0.13 +:to_csvdate_format参数一起使用

尽可能避免将您的datetime64[ns]系列转换为objectdtype系列的datetime.date对象。后者通常使用构造pd.Series.dt.date,存储为指针数组,相对于基于NumPy的纯序列而言效率低下。

由于在写入CSV时您担心的是格式问题,因此只需使用date_format参数即可to_csv。例如:

df.to_csv(filename, date_format='%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

有关格式设置约定,请参见Python的strftime指令


Man*_*and 6

这是提取日期的简单方法:

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)
Run Code Online (Sandbox Code Playgroud)


Dal*_*ung 5

转换为datetime64[D]

df.dates.values.astype('M8[D]')
Run Code Online (Sandbox Code Playgroud)

尽管将其重新分配给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)])
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用astype('M8 [D]'),它将丢失的值转换为原始日期1970-1-1。如今最好只使用pandas.to_datetime()。 (3认同)

Cli*_*der 5

我希望能够更改数据框中一组列的类型,然后删除保留一天的时间。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'))
Run Code Online (Sandbox Code Playgroud)