Pandas:通过时间间隔的另一个数据帧过滤数据帧

2023-12-06

如果我有一个数据框(df_data),例如:

ID        Time                X        Y        Z        H
05  2020-06-26 14:13:16    0.055    0.047    0.039    0.062
05  2020-06-26 14:13:21    0.063    0.063    0.055    0.079
05  2020-06-26 14:13:26    0.063    0.063    0.063    0.079
05  2020-06-26 14:13:31    0.095    0.102    0.079    0.127
...    ..    ...     ...     ...      ...      ...      ...
01  2020-07-01 08:59:43    0.063    0.063    0.047    0.079
01  2020-07-01 08:59:48    0.055    0.055    0.055    0.079
01  2020-07-01 08:59:53    0.071    0.063    0.055    0.082
01  2020-07-01 08:59:58    0.063    0.063    0.047    0.082
01  2020-07-01 08:59:59    0.047    0.047    0.047    0.071

[17308709 rows x 8 columns]

我想通过另一个间隔数据帧(df_intervals)进行过滤,例如:

int_id         start               end
1            2020-02-03 18:11:59   2020-02-03 18:42:00
2            2020-02-03 19:36:59   2020-02-03 20:06:59
3            2020-02-03 21:00:59   2020-02-03 21:31:00
4            2020-02-03 22:38:00   2020-02-03 23:08:00
5            2020-02-04 05:55:00   2020-02-04 06:24:59
...                         ...                   ...
1804         2021-01-10 13:50:00   2021-01-10 14:20:00
1805         2021-01-10 18:10:00   2021-01-10 18:40:00
1806         2021-01-10 19:40:00   2021-01-10 20:10:00
1807         2021-01-10 21:25:00   2021-01-10 21:55:00
1808         2021-01-10 22:53:00   2021-01-10 23:23:00

[1808 rows x 2 columns]

最有效的方法是什么?我有一个很大的数据集,如果我尝试像这样迭代它:

for i in range(len(intervals)):
    df_filtered = df[df['Time'].between(intervals['start'][i], intervals['end'][i])
    ...
    ...
    ...

这需要永远!我知道我不应该迭代大型数据帧,但我不知道如何按第二个数据帧上的每个间隔对其进行过滤。

我尝试执行的步骤是:

1-从 df_intervals 获取所有间隔(开始/结束列);

2- 使用这些时间间隔创建一个新的数据帧 (df_stats),其中包含这些时间范围内列的统计信息。例子:

      start                  end             ID    X_max    X_min    X_mean    Y_max    Y_min    Y_mean    ....
2020-02-03 18:11:59   2020-02-03 18:42:00    01    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 18:11:59   2020-02-03 18:42:00    02    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 18:11:59   2020-02-03 18:42:00    03    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 18:11:59   2020-02-03 18:42:00    04    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 18:11:59   2020-02-03 18:42:00    05    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 19:36:59   2020-02-03 20:06:59    01    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 19:36:59   2020-02-03 20:06:59    02    ...    ...    ...     ...   ...    ...    ...     ...
2020-02-03 19:36:59   2020-02-03 20:06:59    03    ...    ...    ...     ...   ...    ...    ...     ...

如果乔的答案没有给你你想要的速度,我认为可以通过消除 for 循环中的统计计算来改进。 (我正在窃取他的 df 创建,因为他是将其放入答案中的英雄。)理想情况下,您也可以摆脱 for 循环,但我认为随着时间戳索引被重复(跨 ID 号),它可以合并这两个数据框很棘手。

这是我仍然使用迭代来处理开始/结束时间的尝试。首先,我将 int_id 应用于父 df。我想将其添加到父数据帧中,这样我就可以进行“分组”,而无需创建“临时”数据帧并对其进行统计。

for index, row in df2.iterrows():
    
    df1.loc[df1.Time.between(row.start,row.end), 'int_id'] = row.int_id

    ID                Time      X      Y      Z      H  int_id
0   01 2020-02-03 18:13:16  0.011  0.012  0.013  0.014     1.0
1   01 2020-02-03 18:13:21  0.015  0.016  0.017  0.018     1.0
2   01 2020-02-03 18:13:26  0.013  0.013  0.013  0.013     1.0
3   01 2020-02-03 18:13:31  0.015  0.015  0.015  0.015     1.0
4   02 2020-02-03 18:13:16  0.021  0.022  0.023  0.024     1.0
5   02 2020-02-03 18:13:21  0.025  0.026  0.027  0.028     1.0
6   02 2020-02-03 18:13:26  0.023  0.023  0.023  0.023     1.0

然后,我定义聚合,以便在循环完成后一次性获取所有内容。

aggs = {'X':['sum', 'max', 'mean', 'median'], 
        'Y':['sum', 'max', 'mean', 'median'], 
        'Z':['sum', 'max', 'mean', 'median'], 
        'H':['sum', 'max', 'mean', 'median']}

df2 = df1.groupby(by=('int_id')).agg(aggs)

            X                            Y                             Z                            H                        
          sum    max    mean median    sum    max     mean median    sum    max    mean median    sum    max     mean  median
int_id                                                                                                                       
1.0     0.732  0.095  0.0366  0.034  0.739  0.102  0.03695  0.034  0.708  0.079  0.0354  0.034  0.827  0.127  0.04135  0.0345
2.0     0.732  0.095  0.0366  0.034  0.739  0.102  0.03695  0.034  0.708  0.079  0.0354  0.034  0.827  0.127  0.04135  0.0345

注意:这里你在列上有一个多重索引。您可以通过以下方式加入他们。

df_final.columns = ['_'.join(col).strip() for col in df_final.columns.values]

        X_sum  X_max  X_mean  X_median  Y_sum  Y_max   Y_mean  Y_median  Z_sum  Z_max  Z_mean  Z_median  H_sum  H_max   H_mean  H_median
int_id                                                                                                                                  
1.0     0.732  0.095  0.0366     0.034  0.739  0.102  0.03695     0.034  0.708  0.079  0.0354     0.034  0.827  0.127  0.04135    0.0345
2.0     0.732  0.095  0.0366     0.034  0.739  0.102  0.03695     0.034  0.708  0.079  0.0354     0.034  0.827  0.127  0.04135    0.0345
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas:通过时间间隔的另一个数据帧过滤数据帧 的相关文章

随机推荐

  • 了解 Dean Edwards 的 addevent JavaScript

    我需要帮助理解这段代码 重点是什么handler guid 为什么需要哈希表 重点是什么 if element on type handlers 0 element on type 文中的 这个 指的是什么handleEvent 元素还是a
  • 在 PHP 中分割文本文件

    如何使用 PHP 按字符数将大型文本文件拆分为单独的文件 因此 一个 10 000 个字符的文件每 1000 个字符就会被拆分为 10 个文件 此外 只有在找到句号后才可以拆分吗 Thanks 更新 1 我喜欢 zombats 代码 我删除
  • 单元测试适配器抛出异常:不支持 URI 格式

    在 Visual Studio 2010 中 当我使用以下基本代码创建默认测试项目时
  • 让 PowerShell 等待 Excel 完成刷新数据透视表

    所以我开发了一个Powershell脚本来刷新大约40个大的excel文件并保存它们 在这个脚本中我运行一个excel宏来传递excel ODBC 连接参数 然后在刷新完成后从excel文件中删除它们 我唯一的问题是 对于这 40 个文件中
  • qmake 和多个 MSVS 版本

    From Visual Studio 2008 Command Prompt我运行这个命令来生成 vcproj file gt qmake spec win32 msvc2008 并收到警告消息 WARNING Generator MSVC
  • LINQ连接多表

    我有4张桌子 table1 id1 fk tbl2 this is the foreign key to the id in table2 table2 id2 fk tbl3 this is the foreign key to the
  • 如何让gganimate中的点出现而不是过渡

    我正在使用 gganimate 假设我有这个 MWE library ggplot2 library gganimate ggplot airquality aes Day Temp geom point color red size 1
  • 有没有办法以编程方式检测用户何时在浏览器中按下 F5 按钮?

    我有一个缓存 每当用户在浏览器中发出 F5 请求时 我都希望该缓存失效 我正在运行 JSF 2 0 应用程序 有没有办法做到这一点 Use the FacesContext getCurrentInstance isPostBack 检查页
  • 解析 YAML 文件

    这是我第一次使用 YAML 文件 所以我首先想到的是找到任何可以帮助我解析文件的库 我找到了两个库 YamlBean 和 SnakeYAML 我不确定我要使用哪一个 这是我尝试解析的文件的示例 users user1 groups Prem
  • AppEngine Memcache 过期策略

    我期待以下 AppEngine 代码 MemcacheService memcache MemcacheServiceFactory getMemcacheService memcache put Foo Bar Expiration on
  • PHP中删除一行记录

    我试图删除数据库中的一条记录 所以基本上我创建了一个包含我所有记录的表 现在我需要做的是 当我单击 删除 链接时 它将删除记录选定的行 它看起来是这样的 所以基本上我这里有 3 页 1 页面 php2 添加 php3 删除 php 这是我的
  • Waitpid 相当于超时吗?

    想象一下我有一个启动多个子进程的进程 父母需要知道孩子何时退出 我可以用waitpid 但是如果 当父级需要退出时 我无法告诉被阻塞的线程waitpid优雅地退出并加入它 让事情自行清理固然很好 但这可能没什么大不了的 我可以用waitpi
  • Visual Studio Code 无法从 Powershell 打开

    我正在尝试使用 Powershell 打开 Visual Studio Codecode在文件夹内时执行命令 当我尝试这样做时 我总是收到此错误 块引用代码 术语 代码 不被识别为 cmdlet 函数 脚本文件或可操作程序的名称 检查名称的
  • ASP.net MVC - 模型绑定排除类字段?

    在最近的一个项目中 我遇到了意想不到的障碍 具有简单公共字段 注意不是属性 的类似乎不想与 ASP net MVC 3 0 模型绑定器 这是设计使然吗 除了将字段更改为属性之外 这里还有其他选项吗 update 使用简单字段 而不是属性 的
  • JavaScript - SetInterval 无法正常工作

    我得到了这段脚本 在本地运行 但似乎 setInterval 不起作用 发送表单功能不起作用 任何帮助将不胜感激 Thanks 你需要打电话setInterval 函数中不带括号 如下所示 setI
  • 如何禁用音频播放器 HTML5 中的特定控件

    我只想显示音频控件 但禁止用户拖动按钮 因为我不希望用户跳过歌曲 如何使这项工作有效 你不能 您要么显示浏览器的内置控件 要么不显示 所以你应该隐藏它们并制作你自己的 如果你不想要搜索功能 这应该很容易 或者看看像 jPlayer http
  • 如何检查来自 json 的值是否为 null?

    我想检查 json 的结果是否为空 我使用了这段代码 NSString likesCount if facebook valueForKey likes NSNull null return else return facebook val
  • 为什么我的网站不显示我的网站图标?

    我有一个刚刚上传到互联网的网站 当我在 Ubuntu 上使用 Firefox 3 0 1 浏览该网站时 我看不到图标 WinXP 上的 Firefox 3 0 1 确实会显示它 WhyUbuntu下不显示favicon吗 它是根目录中的 f
  • iOS 13:使用新的 NEHotspotConfiguration.init(ssidPrefix: String) 似乎不起作用

    我目前正在运行 Xcode 11 0 和 iOS 13 1 测试版 我正在尝试 iOS 13 中新添加的功能 能够连接到仅已知前缀的 Wifi 热点 苹果文档 这非常适合无头配件的 Wifi 设置 因为您无需要求用户切换到操作系统设置即可连
  • Pandas:通过时间间隔的另一个数据帧过滤数据帧

    如果我有一个数据框 df data 例如 ID Time X Y Z H 05 2020 06 26 14 13 16 0 055 0 047 0 039 0 062 05 2020 06 26 14 13 21 0 063 0 063 0