在熊猫的工作日掩盖特定的小时数

时间:2017-08-03 15:41:52

标签: python pandas dataframe lambda time-series

我有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'功能..

总之,我非常坚持这一点,并没有通过谷歌搜索找到合适的。任何帮助最受赞赏。

1 个答案:

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