python - 使用 "bin size"/"frequency"对 Pandas 数据帧重新采样

标签 python datetime pandas time-series resampling

9我有一个多索引数据帧,我想对其进行重新采样,以将数据点的频率降低 3 倍(意味着每 3 行变为 1 行)。

这个:

                    time  value
   ID  measurement  
ET001            0     0      2
                 1  0.15      3
                 2   0.3      4
                 3  0.45      3
                 4   0.6      3
                 5  0.75      2
                 6   0.9      3
ET002            0     0      2
                 1  0.16      5
                 2  0.32      4
                 3  0.45      3
                 4   0.6      3
                 5  0.75      2

我想变成这样:

                    time  value
   ID  measurement  
ET001            0  0.15      3 
                 1   0.6    2.7
                 2   0.9      3
ET002            0  0.16    3.7 
                 1   0.6    2.7

我尝试将时间列转换为 pandas 日期时间索引,如下所示,然后使用重新采样:

df = df.set_index(pd.DatetimeIndex(timecourse_normed['Time']))
df = df.groupby(level=0).resample(rule='0.1S', how=np.mean) 

但是第一行给出了实际日期(1970 年左右),这对第二行毫无帮助。浏览 arund stack Overflow 我发现了一些类似的 quiestios,它们都有不基于 panda 的重新采样的解决方案 - 而且,遗憾的是,对于我的用例来说不可行。

你能帮我一下吗?

最佳答案

我认为你的想法可能是 - 将每个 ID 内的记录按每个 3 条记录(如 SQL 中的 ntile(3))划分为 bin,并按其分组并计算平均值。为了创建这个数字,我们可以利用这样一个事实:您已经为每行提供了连续的数字 - 索引的测量级别。因此,我们只需将该数字除以 3 即可得到我们需要的数字:

>>> df
                   time  value  ntile
ID    measurement                  
ET001 0            0.00      2      0
      1            0.15      3      0
      2            0.30      4      0
      3            0.45      3      1
      4            0.60      3      1
      5            0.75      2      1
      6            0.90      3      2
ET002 0            0.00      2      0
      1            0.16      5      0
      2            0.32      4      0
      3            0.45      3      1
      4            0.60      3      1
      5            0.75      2      1

因此我们可以使用这样的辅助函数并将其应用于每个组以获得所需的结果。

>>> def helper(x):
...     x = x.reset_index()
...     x = x.groupby(x['measurement'].div(3)).mean()
...     del x['measurement']
...     return x
... 
>>> df.groupby(level=0).apply(helper)
                   time     value
ID    measurement                
ET001 0            0.15  3.000000
      1            0.60  2.666667
      2            0.90  3.000000
ET002 0            0.16  3.666667
      1            0.60  2.666667

希望有帮助。

关于python - 使用 "bin size"/"frequency"对 Pandas 数据帧重新采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134387/

相关文章:

python - 使用 scipy.stats 使用自定义分布拟合数据

python - 如何将 python datetime-span 划分为等间隔的时间间隔?

python - Python实现的简单并发

javascript - 使用数据库日期创建倒计时器

javascript - 如何在 JS/jQuery 中正确显示 php 服务器时间和时区,与用户位置无关?

python - 从 pandas dataframe python 中删除异常值

python - 使用 glob 按特定顺序导入文件

python - 根据输入执行查找时出现问题

javascript - 在 MomentJS 中设置时区

python - Pandas 只保留指定的子序列(groupby order 保留子序列)