如何获取熊猫系列中某个时间范围的行掩码



我有一个名为 SDate 的日期列的pandas DataFrame,我想找到 SDate 小时在下午 2 点到 4 点之间的行,如下所示:

d=pd.read_csv("data.csv",parse_dates=['SDate'])
indices=np.nonzero(d.SDate.hour>=2&d.SDate.hour<=4)[0]

但这不是那样工作的。如何以最熊猫和蟒蛇的方式做到这一点?

如果你想要一个面具,这应该做到:

import pandas as pd
df = pd.DataFrame(data=pd.date_range(start='1/1/2018', end='1/2/2018', freq='H'), columns=['SDate'])
mask = (df.SDate.dt.hour >= 2) & (df.SDate.dt.hour <= 4)
print(mask.values)

输出

[False False  True  True  True False False False False False False False
 False False False False False False False False False False False False
 False]

在上面的例子中,df 是带有日期时间 dtype 列的数据帧 SDate,dt 是类似日期时间的属性(如小时)的访问器对象。

你也可以使用between_time

d = d.set_index('SDate')
d.between_time(start_time = '14:00', end_time = '16:00')

您需要用括号分隔条件:

s = pd.to_datetime(['2018-01-01 02:00', '2015-12-25 15:00'])
indices = np.nonzero(s.hour>=2 & s.hour<=4)[0]
# TypeError: unsupported operand type(s) for &: 'int' and 'Int64Index'
indices = np.nonzero((s.hour>=2) & (s.hour<=4))[0]
# array([0], dtype=int64)

请注意,您可以使用pd.Series.argmax进行此计算,因为标量输出就足够了:

indices = ((s.hour>=2) & (s.hour<=4)).argmax()
# 0

最新更新