我对python很新,并且有一个包含数据的熊猫,需要根据他们的获取时间进行标记。
熊猫有一个时间戳列,包含datetime64
类型的时间戳。
我想评估列中的所有值,并测试它们是否在一定的时间范围内,并根据日期所在的时间间隔在新列中指定标签1-5。 / p>
timestamp: interval:
2017-03-22 13:12:00 1
2017-03-23 13:12:00 1
2017-03-24 13:12:00 2
2017-03-25 13:12:00 2
2017-03-26 13:12:00 2
我尝试过一个函数,可以用下面的数据框调用
def classifyRunHours(series):
if [(series['index_time'] > PERIOD_1) & (series['index_time'] <= PERIOD_2)]:
return 1
elif [(series['index_time'] > PERIOD_2) & (series['index_time'] <= PERIOD_3)]:
return 2
elif [(series['index_time'] > PERIOD_3) & (series['index_time'] <= PERIOD_4)]:
return 3
elif [(series['index_time'] > PERIOD_4) & (series['index_time'] <= PERIOD_5)]:
return 4
else:
return 0
将间隔定义为
PERIOD_1 = '2017-05-20 11:00:00'
这给我带来了一些麻烦,因为我正在比较一个字符串和一个时间戳。
这可能是可以解决的,但我不确定这是否是在列上工作的正确方法。我应该使用lambda
函数来处理整个列吗?或者如何有效地完成这项工作
赞赏任何输入
答案 0 :(得分:1)
我认为您需要cut
+ add_categories
fillna
替换NaN
s:
rng = pd.date_range('2017-04-03', periods=15)
series = pd.DataFrame({'index_time': rng, 'a': range(15)})
PERIOD_1 = '2017-04-05'
PERIOD_2 = '2017-04-08'
PERIOD_3 = '2017-04-10'
PERIOD_4 = '2017-04-11'
PERIOD_5 = '2017-04-13'
bins = pd.DatetimeIndex([PERIOD_1,PERIOD_2,PERIOD_3,PERIOD_4, PERIOD_5])
labels = [1,2,3,4]
series['interval'] = pd.cut(series['index_time'], bins=bins, labels=labels)
series['interval'] = series['interval'].cat.add_categories([0]).fillna(0)
print (series)
a index_time interval
0 0 2017-04-03 0
1 1 2017-04-04 0
2 2 2017-04-05 0
3 3 2017-04-06 1
4 4 2017-04-07 1
5 5 2017-04-08 1
6 6 2017-04-09 2
7 7 2017-04-10 2
8 8 2017-04-11 3
9 9 2017-04-12 4
10 10 2017-04-13 4
11 11 2017-04-14 0
12 12 2017-04-15 0
13 13 2017-04-16 0
14 14 2017-04-17 0
searchsorted
的另一个解决方案:
bins = pd.DatetimeIndex(['1678-01-01',PERIOD_1,PERIOD_2,PERIOD_3,PERIOD_4, PERIOD_5, '2226-01-01'])
labels = [0,1,2,3,4,0]
series['interval'] = np.array(labels)[np.array(bins).searchsorted(series['index_time'].values) - 1]
print (series)
a index_time interval
0 0 2017-04-03 0
1 1 2017-04-04 0
2 2 2017-04-05 0
3 3 2017-04-06 1
4 4 2017-04-07 1
5 5 2017-04-08 1
6 6 2017-04-09 2
7 7 2017-04-10 2
8 8 2017-04-11 3
9 9 2017-04-12 4
10 10 2017-04-13 4
11 11 2017-04-14 0
12 12 2017-04-15 0
13 13 2017-04-16 0
14 14 2017-04-17 0