【问题标题】:How to get mask of rows for a time range in pandas series? [duplicate]如何在熊猫系列中获取时间范围内的行掩码? [复制]
【发布时间】:2019-05-24 03:24:46
【问题描述】:

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

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

但这并不像那样工作。如何以最熊猫和pythonic的方式做到这一点?

【问题讨论】:

  • 能否也提供一些数据?

标签: python pandas


【解决方案1】:

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

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 是具有datetime dtype 列SDate 的DataFrame,dt 是类似日期时间属性的访问器对象,例如小时。

【讨论】:

  • 对,你能不能进一步解释一下什么是SDate.dt,比如它是什么类型,它有什么作用
【解决方案2】:

你也可以使用between_time

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

【讨论】:

    【解决方案3】:

    您需要用括号分隔条件:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多