代码之家  ›  专栏  ›  技术社区  ›  retorquere

在时间间隔内用时间戳标记行

  •  2
  • retorquere  · 技术社区  · 7 年前

    我需要在时间序列中标记行,其中时间戳位于给定的时间块之间;当我有eg

    values = ([ 'motorway' ] * 5000) + ([ 'link' ] * 300) + ([ 'motorway' ] * 7000)
    
    df = pd.DataFrame.from_dict({
      'timestamp': pd.date_range(start='2018-1-1', end='2018-1-2', freq='s').tolist()[:len(values)],
      'road_type': values,
    })
    df.set_index('timestamp', inplace=True)
    

    rush 这标志着 timestamp 介于 06:00 09:00 15:30 19:00 . 我见过 between_time 但我不知道如何在这里应用它。

    编辑:基于 this answer 我设法把

    df['rush'] = df.index.isin(df.between_time('00:00:15', '00:00:20', include_start=True, include_end=True).index) | df.index.isin(df.between_time('00:00:54', '00:00:59', include_start=True, include_end=True).index)
    

    但我不知道是否还有更优雅的方式。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Abhi    7 年前

    另一种方法是使用 between

    from datetime import time as t
    
    values = ([ 'motorway' ] * 5000) + ([ 'link' ] * 300) + ([ 'motorway' ] * 7000)
    
    df = pd.DataFrame.from_dict({
     'timestamp': pd.date_range(start='2018-1-1', end='2018-1-2',
                                   freq='s').tolist()[:len(values)],
      'road_type': values,
    })
    
    time = df['timestamp'].dt.time
    
    df['rush'] = (time.between(t(0,6,0), t(0,9,0)) | time.between(t(0,15,30),t(0,19,0))).values
    

    或是切片 df datetime.time

    df = df.set_index(df.timestamp.dt.time)
    
    df['rush'] = df.index.isin(df[t(0,6,0):t(0,9,0)].index | df[t(0,15,30):t(0,19,0)].index)
    
    df = df.reset_index(drop=True)