Python/Pandas 仅将字符串转换为时间
Posted
技术标签:
【中文标题】Python/Pandas 仅将字符串转换为时间【英文标题】:Python/Pandas convert string to time only 【发布时间】:2016-10-14 13:19:05 【问题描述】:我在 Python 2.7 中有以下 Pandas 数据框。
import pandas as pd
trial_num = [1,2,3,4,5]
sail_rem_time = ['11:33:11','16:29:05','09:37:56','21:43:31','17:42:06']
dfc = pd.DataFrame(zip(*[trial_num,sail_rem_time]),columns=['Temp_Reading','Time_of_Sail'])
print dfc
数据框如下所示:
Temp_Reading Time_of_Sail
1 11:33:11
2 16:29:05
3 09:37:56
4 21:43:31
5 17:42:06
此数据框来自 *.csv 文件。我使用 Pandas 将 *.csv 文件作为 Pandas 数据框读取。当我使用print dfc.dtypes
时,它显示Time_of_Sail
列的数据类型为object
。我想将此列转换为 datetime
数据类型但我只想要时间部分 - 我不想要年、月、日。
我可以试试这个:
dfc['Time_of_Sail'] = pd.to_datetime(dfc['Time_of_Sail'])
dfc['Time_of_Sail'] = [time.time() for time in dfc['Time_of_Sail']]
但问题是当我运行print dfc.dtypes
时,它仍然显示Time_of_Sail
列是object
。
有没有办法将此列转换为只有时间的日期时间格式?
其他信息:
要创建上述数据框和输出,这也可以:
import pandas as pd
trial_num = [1,2,3,4,5]
sail_rem_time = ['11:33:11','16:29:05','09:37:56','21:43:31','17:42:06']
data = [
[trial_num[0],sail_rem_time[0]],
[trial_num[1],sail_rem_time[1]],[trial_num[2],sail_rem_time[2]],
[trial_num[3],sail_rem_time[3]]
]
dfc = pd.DataFrame(data,columns=['Temp_Reading','Time_of_Sail'])
dfc['Time_of_Sail'] = pd.to_datetime(dfc['Time_of_Sail'])
dfc['Time_of_Sail'] = [time.time() for time in dfc['Time_of_Sail']]
print dfc
print dfc.dtypes
【问题讨论】:
我使用的是 python 3.4,但无法重现您的问题。当我尝试您建议的转换时,我发现 dtype 已更改为datetime64[ns]
。附带说明一下,您的数据框的构造对我不起作用,因为 zip 返回了一个迭代器,该迭代器不被 DataFrame 构造函数接受。这可能是一个非常愚蠢的问题,但是您是否尝试过运行您发布的确切代码?
是的,刚刚又试了一次。对我有用。在我尝试了两种转换之后,dtype
是object
,但如果只运行第一次转换,dtype
会更改为datetime64[ns]
。
你是说它现在可以工作了?
是的,它似乎对我有用。
好的,我添加了另一种方法来创建数据框和问题。这可能会有所帮助 - 这种新方法对我来说似乎更简单。
【参考方案1】:
如果有人正在寻找更通用的答案,请尝试
dfc['Time_of_Sail']= pd.to_datetime(dfc['Time_of_Sail'])
【讨论】:
【参考方案2】:这似乎有效:
dfc['Time_of_Sail'] = pd.to_datetime(dfc['Time_of_Sail'], format='%H:%M:%S' ).apply(pd.Timestamp)
【讨论】:
【参考方案3】:使用to_timedelta,我们可以通过指定单位为秒,分钟等将字符串转换为时间格式(timedelta64[ns]),
dfc['Time_of_Sail'] = pd.to_timedelta(dfc['Time_of_Sail'], unit='s')
【讨论】:
【参考方案4】:这两行:
dfc['Time_of_Sail'] = pd.to_datetime(dfc['Time_of_Sail'])
dfc['Time_of_Sail'] = [time.time() for time in dfc['Time_of_Sail']]
可以写成:
dfc['Time_of_Sail'] = pd.to_datetime(dfc['Time_of_Sail'],format= '%H:%M:%S' ).dt.time
【讨论】:
谢谢。这解决了我的问题 - 我可以指定我所追求的时间(无日期)格式, 你能告诉我最后是什么dt.time
,它有什么作用。我猜是导入的日期时间模块
是否可以这样做inplace
?
嗨,这将导致 dtype 是 object 而不是 datime。【参考方案5】:
如果您只是想要一个简单的转换,您可以执行以下操作:
import datetime as dt
dfc.Time_of_Sail = dfc.Time_of_Sail.astype(dt.datetime)
或者您可以将持有者字符串添加到您的时间列,如下所示,然后使用 apply 函数进行转换:
dfc.Time_of_Sail = dfc.Time_of_Sail.apply(lambda x: '2016-01-01 ' + str(x))
dfc.Time_of_Sail = pd.to_datetime(dfc.Time_of_Sail).apply(lambda x: dt.datetime.time(x))
【讨论】:
以上是关于Python/Pandas 仅将字符串转换为时间的主要内容,如果未能解决你的问题,请参考以下文章
python pandas:仅将数据帧的结构(无行)导出到 SQL