【问题标题】:Remove rows where date doesn't fall into any date ranges删除日期不属于任何日期范围的行
【发布时间】:2017-04-26 15:37:32
【问题描述】:

所以我有一个 2 列数据框 datetimevalue,我想删除不属于至少一个日期范围的所有行。

例如假设我的有效日期范围表示为元组

valid_date_ranges = [
                        (2017-01-01 00:00:00.00, 2017-01-03 15:00:00.00),
                        (2017-01-04 03:25:00.00, 2017-01-06 22:56:00.00),
                        ...
                    ]

我有一个这样的数据框

datetime                value
2017-01-01 00:00:00.00  1234
2017-01-01 00:01:00.00  13241526
2017-01-01 10:02:00.00  356356
2017-01-01 10:03:00.00  17435
2017-01-01 10:04:00.00  5234515
2017-01-01 10:05:00.00  52452435
...
2017-01-03 14:59:00.00  156256
2017-01-03 15:00:00.00  665654
2017-01-03 15:01:00.00  890656      *
2017-01-03 15:02:00.00  698765      *
2017-01-03 15:03:00.00  6574        *
...
2017-01-04 03:23:00.00  6541632     *
2017-01-04 03:24:00.00  1234        *
2017-01-04 03:25:00.00  4657347
2017-01-04 03:26:00.00  765
2017-01-04 03:27:00.00  870089
...

我想删除末尾带有星号的行,因为它们不属于任何日期范围。

【问题讨论】:

  • 根据您指定的排除范围,2017-01-04 03:24:00.00 1234 似乎也应该是一个星号行。
  • @andrew_reece 已编辑,谢谢。

标签: python date pandas


【解决方案1】:

这是一种方法:

# sample df and ranges to exclude, per OP
datetime                value
"2017-01-01 00:00:00.00"  1234
"2017-01-01 00:01:00.00"  13241526
"2017-01-01 10:02:00.00"  356356
"2017-01-01 10:03:00.00"  17435
"2017-01-01 10:04:00.00"  5234515
"2017-01-01 10:05:00.00"  52452435
"2017-01-03 14:59:00.00"  156256
"2017-01-03 15:00:00.00"  665654
"2017-01-03 15:01:00.00"  890656      
"2017-01-03 15:02:00.00"  698765      
"2017-01-03 15:03:00.00"  6574    
"2017-01-04 03:23:00.00"  6541632     
"2017-01-04 03:24:00.00"  1234
"2017-01-04 03:25:00.00"  4657347
"2017-01-04 03:26:00.00"  765
"2017-01-04 03:27:00.00"  870089

df = pd.read_clipboard(parse_dates=True, index_col='datetime')

valid_date_ranges = [("2017-01-01 00:00:00.00", "2017-01-03 15:00:00.00"),
                    ("2017-01-04 03:25:00.00", "2017-01-06 22:56:00.00")]
dranges = [pd.date_range(start, end, freq='min') for start, end in valid_date_ranges]

现在删除日期范围内未找到的行,并在新的 filtered 数据框中构建剩余的行:

filtered = pd.DataFrame()
for drange in dranges:
    filtered = pd.concat([filtered,df.drop(df.index[~df.index.isin(drange)])])

print(filtered)
                        value
datetime                     
2017-01-01 00:00:00      1234
2017-01-01 00:01:00  13241526
2017-01-01 10:02:00    356356
2017-01-01 10:03:00     17435
2017-01-01 10:04:00   5234515
2017-01-01 10:05:00  52452435
2017-01-03 14:59:00    156256
2017-01-03 15:00:00    665654
2017-01-04 03:25:00   4657347
2017-01-04 03:26:00       765
2017-01-04 03:27:00    870089

【讨论】:

  • 我想保留日期范围内的行,而不是删除它们。
  • 对不起,这是一个错字 - 请注意输出是正确的。
  • 我想的差不多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 2014-01-07
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多