我用熊猫。To_datetime解析数据中的日期。Pandas默认情况下表示datetime64[ns]的日期,即使这些日期都是每天的。 我想知道是否有一种优雅/聪明的方法将日期转换为datetime。[D]这样,当我把数据写入CSV时,日期不会附加00:00:00。我知道我可以逐个元素手动转换类型:

[dt.to_datetime().date() for dt in df.dates]

但这真的很慢,因为我有很多行,这有点违背了使用pandas.to_datetime的目的。是否有一种方法可以一次转换整个列的dtype ?或者,熊猫也一样。to_datetime支持一个精度规范,以便我可以摆脱时间部分,同时与日常数据?


当前回答

如果该列不是datetime格式:

df['DTformat'] = pd.to_datetime(df['col'])

一旦它是datetime格式,你可以将整个列转换为日期,就像这样:

df['DateOnly'] = df['DTformat'].apply(lambda x: x.date())

其他回答

在>1000000行的表中,我发现这些都是快速的,地板只是稍微快一点:

df['mydate'] = df.index.floor('d')

or

df['mydate'] = df.index.normalize()

如果你的索引有时区,而你不想在结果中显示这些时区,请执行以下操作:

df['mydate'] = df.index.tz_localize(None).floor('d')

Df.index.date要慢很多倍;To_datetime()更糟糕。两者都有进一步的缺点,结果不能保存到hdf存储,因为它不支持datetime.date类型。

注意,这里我使用索引作为日期源;如果您的源是另一列,则需要添加.dt,例如df.mycol.dt.floor('d')

我希望能够更改数据帧中一组列的类型,然后删除保持日期的时间。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'))

Pandas DatetimeIndex和Series有一个叫做normalize的方法,它可以做你想做的事情。

你可以在这个答案中了解更多。

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

df(“列”)= df(“列”).dt.strftime(“% m / % d / Y %”)

这将给你的只是日期,没有时间在你想要的格式。您可以根据需要更改格式'%m/%d/%Y'它将更改列的数据类型为'object'。


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

df['Column'] = pd.to_datetime(df['Column']).dt.date

数据类型为“object”。


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

df['Column'] = pd.to_datetime(df['Column']).dt.normalize()

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

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

pd.to_datetime(df['Date'], utc=False)

你将能够在excel中保存它而不会得到错误“ValueError: excel不支持带时区的日期时间。在写入Excel之前,请确保日期时间不受时区影响。”