我有pandas.Dataframe,看起来像这样:
A
date
2017-07-22 04:30:00 2707.500000
2017-07-22 05:00:00 2715.400000
2017-07-22 05:30:00 2759.300000
2017-07-22 06:00:00 2755.079086
2017-07-22 08:30:00 2840.000000
2017-07-22 09:00:00 2817.500000
2017-07-22 09:30:00 2818.900000
2017-07-22 10:00:00 2838.300000
2017-07-22 10:30:00 2865.300000
2017-07-22 11:00:00 2888.800000
... ...
... ...
2017-08-03 11:30:00 2742.000000
2017-08-03 12:00:00 2737.000000
2017-08-03 12:30:00 2732.000000
2017-08-03 13:00:00 2738.000000
2017-08-03 13:30:00 2742.800000
2017-08-03 14:00:00 2736.900000
2017-08-03 14:30:00 2733.300000
2017-08-03 15:00:00 2739.400000
..等等
我要做的是创建一个掩码,选择所有行,其中日期是一周工作日,小时数在[X]和[Y]之内。
示例:
mask = SELECT ROWS where Date is a Weekday and Hour is greater than 9am and less than 5pm
我的想法是这样的:
newdf = df.apply(lambda x : np.where(pd.date_range(??, ??).weekday), axis=1)
我也看到过一些' isin'功能..
总之,我非常坚持这一点,并没有通过谷歌搜索找到合适的。任何帮助最受赞赏。
答案 0 :(得分:2)
这是一种方式
In [1140]: (df.index.hour >= 9) & (df.index.hour <= 17) & (df.index.weekday < 5)
Out[1140]:
array([False, False, False, False, False, False, False, False, False,
False, True, True, True, True, True, True, True, True], dtype=bool)
In [1141]: df[(df.index.hour >= 9) & (df.index.hour <= 17) & (df.index.weekday < 5)]
Out[1141]:
A
date
2017-08-03 11:30:00 2742.0
2017-08-03 12:00:00 2737.0
2017-08-03 12:30:00 2732.0
2017-08-03 13:00:00 2738.0
2017-08-03 13:30:00 2742.8
2017-08-03 14:00:00 2736.9
2017-08-03 14:30:00 2733.3
2017-08-03 15:00:00 2739.4
而且,如果您的数据不需要工作日检查,那么对于时间过滤,您可以使用between_time
In [1144]: df.between_time('9:00AM', '5:00PM')
Out[1144]:
A
date
2017-07-22 09:00:00 2817.5
2017-07-22 09:30:00 2818.9
2017-07-22 10:00:00 2838.3
2017-07-22 10:30:00 2865.3
2017-07-22 11:00:00 2888.8
2017-08-03 11:30:00 2742.0
2017-08-03 12:00:00 2737.0
2017-08-03 12:30:00 2732.0
2017-08-03 13:00:00 2738.0
2017-08-03 13:30:00 2742.8
2017-08-03 14:00:00 2736.9
2017-08-03 14:30:00 2733.3
2017-08-03 15:00:00 2739.4