如何从充满 datetime.time 值的系列中提取小时、分钟和秒

Posted

技术标签:

【中文标题】如何从充满 datetime.time 值的系列中提取小时、分钟和秒【英文标题】:How to extract hour, minute and second from Series filled with datetime.time values 【发布时间】:2018-08-24 04:58:17 【问题描述】:

数据:

0    09:30:38
1    13:40:27
2    18:05:24
3    04:58:08
4    09:00:09

基本上我想做的是把它分成三列[小时、分钟、秒]

我尝试了以下代码,但似乎都没有工作:

train_sample.time.hour
AttributeError: 'Series' object has no attribute 'hour'

train_sample.time.dt.hour
AttributeError: Can only use .dt accessor with datetimelike values 

pd.DatetimeIndex(train_sample.time).hour
TypeError: <class 'datetime.time'> is not convertible to datetime

这看起来很简单,但我想不通。任何帮助将非常感激。

【问题讨论】:

【参考方案1】:

使用带有times 提取属性的列表推导:

import datetime as datetime

df = pd.DataFrame('time': [datetime.time(9, 30, 38), 
                            datetime.time(13, 40, 27), 
                            datetime.time(18, 5, 24),
                            datetime.time(4, 58, 8), 
                            datetime.time(9, 0, 9)])

print (df)
       time
0  09:30:38
1  13:40:27
2  18:05:24
3  04:58:08
4  09:00:09

df[['h','m','s']] = pd.DataFrame([(x.hour, x.minute, x.second) for x in df['time']])

或者转换成strings,拆分后转换成int

df[['h','m','s']] = df['time'].astype(str).str.split(':', expand=True).astype(int)

print (df)
       time   h   m   s
0  09:30:38   9  30  38
1  13:40:27  13  40  27
2  18:05:24  18   5  24
3  04:58:08   4  58   8
4  09:00:09   9   0   9

【讨论】:

【参考方案2】:

使用: 进行拆分并创建一个数据框,将每个拆分作为单独的列值。

import pandas as pd

d = 0: '09:30:38', 
     1: '13:40:27', 
     2: '18:05:24',
     3: '04:58:08',
     4: '09:00:09'

df = pd.DataFrame([v.split(':') for v in d.values()], columns=['hour', 'minute', 'second'])
print(df)

结果:

  hour minute second
0   09     30     38                                        
1   13     40     27                                        
2   18     05     24                                        
3   04     58     08                                        
4   09     00     09      

【讨论】:

我喜欢这种方式,因为它保留了前导0【参考方案3】:

看起来您的问题实际上只是缺少 datetime accessor 在系列末尾使用 dt 然后您可以使用 .hour 方法提取

train_sample['hour'] = train_sample.dt.hour
train_sample['minute'] = train_sample.dt.minute
train_sample['second'] = train_sample.dt.second

【讨论】:

【参考方案4】:

一种方法是转换为timedelta 并通过pd.Series.dt.components: 提取

df[['hour','minute','second']] = pd.to_timedelta(df['time']).dt.components.iloc[:, 1:4]

结果

       time  hour  minute  second
0  09:30:38     9      30      38
1  13:40:27    13      40      27
2  18:05:24    18       5      24
3  04:58:08     4      58       8
4  09:00:09     9       0       9

【讨论】:

以上是关于如何从充满 datetime.time 值的系列中提取小时、分钟和秒的主要内容,如果未能解决你的问题,请参考以下文章

数据分析系列 之python中的日期格式应用

pandas中,类型为datetime.time,如何进行比较?

如何将增量添加到 python datetime.time?

mysql 开发基础系列3

如何在python中初始化time()对象

如何从一系列字典中创建键和值的数据框[重复]