我在一个 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万行,这要花很长时间。
1条答案
按热度按时间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的速度优势。你看完了就把日期去掉。