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


当前回答

从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

其他回答

从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)])

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()

Pandas v0.13+:使用带date_format参数的to_csv

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

由于您关心的是写入CSV时的格式,只需使用to_csv的date_format参数。例如:

df.to_csv(filename, date_format='%Y-%m-%d')

有关格式约定,请参阅Python的strftime指令。

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