我有一个数据框
import pandas as pd
d = {'name':['a','b','c'],'time': ['18:15:10','06:16:03','11:51:01']}
df = pd.DataFrame(data=d)
我计划将时间转换为一个插槽。例如,将时间(('00:00:00'-'00:59:59')中的地图时间设置为“ 1”,将时间在((8:00:00'-'8:59:59')中)
作为9
。
我如何在df中添加一列,这样我的最终df是
name time slot
'a' '18:15:10' 18
如果我将('00:00:00'-'5:59:59')
中的时间转换为1
怎么办?在这种情况下,我的时隙有很大的时间间隔。
谢谢
问题来源:stackoverflow
希望我正确理解了您的想法。
首先,将您的time列转换为timedelta64:
df['time']=pd.to_timedelta(df['time'])
如果只想在每x
小时内转换时间,答案很简单:
import numpy as np
x = 5
ranges = [(i,i+x) for i in range(0,24,x)]
df['slot'] = df['time'].apply(lambda x:[t<= (x/np.timedelta64(1, 'h')) <T for t,T in ranges].index(True)+1)
结果:
+----+--------+-----------------+--------+
| | name | time | slot |
|----+--------+-----------------+--------|
| 0 | a | 0 days 18:15:10 | 4 |
| 1 | b | 0 days 06:16:03 | 2 |
| 2 | c | 0 days 11:51:01 | 3 |
+----+--------+-----------------+--------+
而且,如果您想要自定义灵活的时间范围(可能与* h:m:s`*一样精确),则应该:
ranges = [('0:0:0','12:0:0'),('12:0:0','23:59:59')]
ranges = [pd.to_timedelta(i) for i in ranges]
df['slot'] = df['time'].apply(lambda x:[t<=x<T for t,T in ranges].index(True)+1)
结果:
+----+--------+-----------------+--------+
| | name | time | slot |
|----+--------+-----------------+--------|
| 0 | a | 0 days 18:15:10 | 2 |
| 1 | b | 0 days 06:16:03 | 1 |
| 2 | c | 0 days 11:51:01 | 1 |
+----+--------+-----------------+--------+
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。