【问题标题】:Pandas time series based filtering基于 Pandas 时间序列的过滤
【发布时间】:2019-11-17 06:31:19
【问题描述】:

有一个时间序列捕获每秒的能量消耗,一个月的数据,加载到带有时间戳索引的 pandas 数据帧中。尝试开发一个代码,该代码将吐出每秒能量消耗大于 1500 的确切持续时间窗口窗口接近 3 小时(可能介于 2 小时 50 分钟到 3 小时 10 分钟之间)。这个窗口每天都会出现一个月,因此目标是捕获每天的确切窗口持续时间

                         energy_consumed
timestamp   
2011-08-01 00:00:00-07:00   1322
2011-08-01 00:00:01-07:00   1322
2011-08-01 00:00:02-07:00   1328
2011-08-01 00:00:03-07:00   1328
2011-08-01 00:00:04-07:00   1328
2011-08-01 00:00:05-07:00   1328
2011-08-01 00:00:06-07:00   1328
2011-08-01 00:00:07-07:00   1320
2011-08-01 00:00:08-07:00   1320
2011-08-01 00:00:09-07:00   1320
2011-08-01 00:00:10-07:00   1320
2011-08-01 00:00:11-07:00   1320
2011-08-01 00:00:12-07:00   1320
2011-08-01 00:00:13-07:00   1320
2011-08-01 00:00:14-07:00   1320
2011-08-01 00:00:15-07:00   1320
2011-08-01 00:00:16-07:00   1320
2011-08-01 00:00:17-07:00   1318
2011-08-01 00:00:18-07:00   1318
2011-08-01 00:00:19-07:00   1318

完整的数据文件here

【问题讨论】:

  • 您可以尝试遍历您的数据框并查看 energy_consumed 的连续出现在 1500 以上,并通过维护 2 个指针来跟踪此类连续行的计数,一个用于开始,另一个用于遍历行和一旦获得所需的窗口,最终保存两个指针的值。
  • 虽然你的问题很有趣。如果没有样本数据,很难开发和测试解决方案。您给定的数据既不是 3 小时长,也不包含任何大于 1500 的幂。请记住提供尽可能接近您的问题描述的示例数据。
  • 在帖子中添加了完整的数据集链接

标签: pandas python-2.7 time-series


【解决方案1】:

您是否考虑过使用.isin() 方法?

它基本上会根据您选择的列的列表中的特定值过滤您的DataFrame

因此,首先您必须从 energy_consumed 列中获取值为 >1500 的所有值,并将它们全部放在一个列表中,并将该列表用作 .isin() 方法中的参数:

energy_greater_than_condition_list = [x for x in df['energy_consumed'].values.tolist() if x > 1500]

df = df.loc[df['energy_consumed'].isin(energy_greater_than_condition_list)]

执行上述代码后,df 现在将具有大于1500energy_consumed 值的所有timestampenergy_consumed 值。

我希望这会有所帮助:))。

【讨论】:

  • 注意:为避免计算时间过长,特别是如果您有一个很长的energy_greater_than_condition_list,最好将您将用于过滤的列(“energy_consumed”列)转换为DataFrame的索引。因此,如果 energy_consumed 中大于 1500 的条目数量较多,您可能希望将原始索引 - timestamp 声明为 DataFrame 中的列而不是其索引。
猜你喜欢
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多