【问题标题】:How to drop rows based on timestamp where hours are not in list如何根据时间不在列表中的时间戳删除行
【发布时间】:2019-07-22 17:38:28
【问题描述】:

我有一个大型数据框(数百万行),其中我的一列是格式为“hh:mm:ss”的时间戳(标记为“时间戳”),例如“07:00:04”。我想删除小时不在或等于 7 和 21 之间的行。

我已经尝试将时间戳转换为字符串并使用切片,但我无法让它工作,我相信应该有更有效的方法。

# Create list of opening hours (these should not be droped)
opening_hour = 7
closeing_hour = 21
trading_hours = []
for hour in range(closeing_hour - opening_hour + 1):
    add_hour = opening_hour + hour
    trading_hours.append(add_hour)

我的数据框看起来像这样:

      Date Timestamp      Close
0  20180102  07:05:00  12925.979
1  20180102  21:05:02  12925.479
2  20180102  22:05:04  12925.280
3  20180102  23:55:06  12925.479
4  20180102  06:05:07  12925.780
5  20180103  07:05:07  12925.780
[...]

我想删除索引为 2、3 和 4 的行(有几千行),所以结果应该是这样的:

  Date Timestamp      Close
0  20180102  07:05:00  12925.979
1  20180102  21:05:02  12925.479
2  20180103  07:05:07  12925.780
[...]

【问题讨论】:

    标签: python pandas dataframe conditional-statements


    【解决方案1】:

    首先你可以给你的DataFrame一个正确的DatetimeIndex如下:

    dtidx = pd.DatetimeIndex(df['Date'].astype(str) + ' ' + df['Timestamp'].astype(str))
    df.index = dtidx
    

    然后使用between_time 获取 07 到 21 小时之间的时间:

    df.between_time('07:00', '22:00')
    # returns
                             Date Timestamp   Close
    2018-01-02 07:05:00  20180102  07:05:00   12926
    2018-01-02 21:05:02  20180102  21:05:02 12925.5
    2018-01-03 07:05:07  20180103  07:05:07 12925.8
    

    【讨论】:

      【解决方案2】:

      既然你提到了切片并且有人已经提到了如何使用它,我想向你介绍使用dt.hour提取小时

      首先将字符串类型的日期转换为日期时间类型的日期:

      df['date'] = pd.to_datetime(df['date'])
      

      您现在可以使用dt.hour 轻松提取小时部分:

      df['hour'] = df['date'].dt.hour
      

      您也可以通过类似的方式提取年、月、秒等。

      现在您可以像处理其他数据帧一样进行正常过滤:

      df[(df.hour >= 7) & (df.hour <= 21)]
      

      【讨论】:

        【解决方案3】:

        我更喜欢其他适用于正确时间戳数据类型的答案,但是由于您提到尝试使用字符串切片方法并失败,因此查看使用字符串切片的解决方案可能会有所帮助:

        df['Hour'] = df['Timestamp'].str.slice(0, 2).astype(int)
        df[(df['Hour'] >= 7) & (df['Hour'] <= 21)]
        

        第一行从代表小时的字符串切片创建一个新的整数列,第二行过滤所述新列。

               Date Timestamp      Close  Hour
        0  20180102  07:05:00  12925.979     7
        1  20180102  21:05:02  12925.479    21
        5  20180103  07:05:07  12925.780     7
        

        【讨论】:

          【解决方案4】:

          我的猜测是使用pd.between_time

          df['Timestamp'] = pd.to_datetime(df['Timestamp'])
          df.set_index('Timestamp').between_time('07:00:00', '21:59:59')
          
          Timestamp           Date        Close
          2019-07-22 07:05:00 20180102    12925.979
          2019-07-22 21:05:02 20180102    12925.479
          2019-07-22 07:05:07 20180103    12925.78
          

          【讨论】:

            猜你喜欢
            • 2020-01-22
            • 2022-10-14
            • 1970-01-01
            • 1970-01-01
            • 2021-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多