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 构造函数接受。这可能是一个非常愚蠢的问题,但是您是否尝试过运行您发布的确切代码? 是的,刚刚又试了一次。对我有用。在我尝试了两种转换之后,dtypeobject,但如果只运行第一次转换,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

python:pandas计算时间差

如何使用空值将字符串转换为日期时间 - python,pandas?

python Pandas - 将列转换为字符串或数字类型

在 std::string 中仅将数字转换为 int

python pandas中如何将dataframe中的一列字符串类型转换为浮点类型?