代码之家  ›  专栏  ›  技术社区  ›  Ofek Ron

如何获得熊猫系列中某个时间范围的行掩码?[副本]

  •  0
  • Ofek Ron  · 技术社区  · 6 年前

    我有一个 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]
    

    3 回复  |  直到 6 年前
        1
  •  2
  •   Dani Mesejo    6 年前

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

    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 SDate , dt 是datetimelike属性(如小时)的访问器对象。

        2
  •  0
  •   Mohit Motwani    6 年前

    你可以用 between_time

    d = d.set_index('SDate')
    d.between_time(start_time = '14:00', end_time = '16:00')
    
        3
  •  0
  •   jpp    6 年前

    您需要通过括号分隔条件:

    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