我用熊猫。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支持一个精度规范,以便我可以摆脱时间部分,同时与日常数据?


当前回答

这在UTC时间戳上为我工作(2020-08-19T09:12:57.945888)

for di, i in enumerate(df['YourColumnName']):
    df['YourColumnName'][di] = pd.Timestamp(i)

其他回答

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

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

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

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

更好的替代方法是使用df['dates'].dt.floor('d')。严格来说,它并不是“只保留日期部分”,因为它只是将时间设置为00:00:00。但它确实按照OP的要求工作,例如:

印刷到丝网 保存到CSV 使用列进行分组

... 而且效率更高,因为运算是向量化的。

编辑:事实上,OP们更喜欢的答案可能是“最近版本的熊猫不把时间写入csv,如果所有的观测值都是00:00:00”。

从0.15.0版本开始,现在可以很容易地使用.dt来访问date组件:

df['just_date'] = df['dates'].dt.date

上面返回一个日期时间。Date dtype,如果你想要一个datetime64,那么你可以将time组件规范化为midnight,这样它就会将所有值设置为00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()

这将dtype保持为datetime64,但是显示只显示日期值。

Pandas: .dt访问器 pandas.Series.dt

转换为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)])

如果该列不是datetime格式:

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

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

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