在Pandas中将对象类型的小时:分钟:秒列转换为日期时间类型

6ioyuze2  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(338)

我在一个 Dataframe 中有一个名为Time的列,如下所示:

599359    12:32:25
326816    17:55:22
326815    17:55:22
358789    12:48:25
361553    12:06:45
            ...   
814512    21:22:07
268266    18:57:31
659699    14:28:20
659698    14:28:20
268179    17:48:53
Name: Time, Length: 546967, dtype: object

现在它是一个object dtype,我尝试了以下方法将其转换为datetime:
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S', errors='coerce', utc = True).dt.time
我知道需要.dt.time方法来防止添加年和月,但我相信这会导致dtype恢复为对象。
有什么解决办法吗?我知道我可以
df['Time'] = df['Time'].apply(pd.to_datetime, format='%H:%M:%S', errors='coerce', utc = True)
但我有超过50万行,这要花很长时间。

ccrfmcuu

ccrfmcuu1#

当您执行此操作时:df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S', errors='coerce', utc = True).dt.time,您正在将'Time'列转换为将pd.dtype转换为object ...并且该"对象"是python类型datetime.time
panda的dtype pd.datetime与python的datetime.datetime对象是不同的类型,而且panda的pd.datetime不支持time对象(也就是说,你不能让panda把一个列当作一个日期时间而不提供年份),这是dtype被修改为object的原因。
在第二种方法中,这里发生了一些稍微不同的事情,在这个例子中你把pd.to_datetime应用到'Time'系列的每个标量元素上,取一个look at the return types of the function in the docs,,但是基本上在这个例子中,df中的时间值在1900年1月1日被转换成pd.datetime对象。(即添加默认日期)。
因此:panda的行为是正确的。如果你只想要时间,那么可以使用列中的datetime.time对象。但是要操作它们,你可能要依赖许多[慢] df.apply方法。或者,只要保持默认日期1900-01-01,然后您可以添加/减去pd.datetime列,并获得Pandas的速度优势。你看完了就把日期去掉。

相关问题