【问题标题】:Filter Dataframe with a list of time ranges使用时间范围列表过滤数据框
【发布时间】:2017-09-19 06:09:06
【问题描述】:

以下是我的设置的简化版本:

import pandas as pd
import datetime as dt

df_data = pd.DataFrame({'DateTime' : [dt.datetime(2017, 9, 1, 0, 0, 0),dt.datetime(2017, 9, 1, 1, 0, 0),dt.datetime(2017, 9, 1, 2, 0, 0),dt.datetime(2017, 9, 1, 3, 0, 0)], 'Data' : [1,2,3,5]})

df_timeRanges = pd.DataFrame({'startTime':[dt.datetime(2017, 8, 30, 0, 0, 0), dt.datetime(2017, 9, 1, 1, 30, 0)], 'endTime':[dt.datetime(2017, 9, 1, 0, 30, 0), dt.datetime(2017, 9, 1, 2, 30, 0)]})

print df_data
print df_timeRanges

这给出了:

   Data            DateTime
0     1 2017-09-01 00:00:00
1     2 2017-09-01 01:00:00
2     3 2017-09-01 02:00:00
3     5 2017-09-01 03:00:00
              endTime           startTime
0 2017-09-01 00:30:00 2017-08-30 00:00:00
1 2017-09-01 02:30:00 2017-09-01 01:30:00

我想用df_timeRanges 过滤df_data,将剩余的行放在一个数据框中,有点像:

df_data_filt = df_data[(df_data['DateTime'] >= df_timeRanges['startTime']) & (df_data['DateTime'] <= df_timeRanges['endTime'])]

我没想到上面的行会起作用,它返回了这个错误:

ValueError: Can only compare identically-labeled Series objects

谁能提供一些关于此的提示?我实际任务中的df_datadf_timeRanges 要大得多。

提前致谢

【问题讨论】:

  • DateTimedf_data 中是否唯一?
  • 是的,所有三个时间字段都是唯一的,并且没有一个时间范围重叠

标签: python pandas datetime dataframe


【解决方案1】:

IIUIC,使用

In [794]: mask = np.logical_or.reduce([
             (df_data.DateTime >= x.startTime) & (df_data.DateTime <= x.endTime) 
             for i, x in df_timeRanges.iterrows()])

In [795]: df_data[mask]
Out[795]:
   Data            DateTime
0     1 2017-09-01 00:00:00
2     3 2017-09-01 02:00:00

或者,也

In [807]: func = lambda x: (df_data.DateTime >= x.startTime) & (df_data.DateTime <= x.endTime)

In [808]: df_data[df_timeRanges.apply(func, axis=1).any()]
Out[808]:
   Data            DateTime
0     1 2017-09-01 00:00:00
2     3 2017-09-01 02:00:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多