Pandas,根据dataintervals创建一个列值

时间:2017-10-27 13:38:17

标签: python pandas datetime

我对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函数来处理整个列吗?或者如何有效地完成这项工作

赞赏任何输入

1 个答案:

答案 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