Python 熊猫-按日期时间索引重新采样/分组并执行计算

Python 熊猫-按日期时间索引重新采样/分组并执行计算,python,pandas,datetime,time-series,Python,Pandas,Datetime,Time Series,我会尽力解释我需要什么帮助。我有下面的df(数千行,如果不是数百万行的话),带有日期时间索引,如下面的示例所示: INDEX COL A COL B 2018-05-07 21:53:13.731 0.365127 9391.800000 2018-05-07 21:53:16.201 0.666127 9391.800000 2018-05-07 21:53:18.038 0.143104 9391.800000 2018-05

我会尽力解释我需要什么帮助。我有下面的df(数千行,如果不是数百万行的话),带有日期时间索引,如下面的示例所示:

INDEX                   COL A       COL B
2018-05-07 21:53:13.731 0.365127    9391.800000
2018-05-07 21:53:16.201 0.666127    9391.800000
2018-05-07 21:53:18.038 0.143104    9391.800000
2018-05-07 21:53:18.243 0.025643    9391.800000
2018-05-07 21:53:18.265 0.640484    9391.800000
2018-05-07 21:53:18.906 -0.100000   9391.793421
2018-05-07 21:53:19.829 0.559516    9391.800000
2018-05-07 21:53:19.846 0.100000    9391.800000
2018-05-07 21:53:19.870 0.006560    9391.800000
2018-05-07 21:53:20.734 0.666076    9391.800000
2018-05-07 21:53:20.775 0.666076    9391.800000
2018-05-07 21:53:28.607 0.100000    9391.800000
2018-05-07 21:53:28.610 0.041991    9391.800000
2018-05-07 21:53:29.283 -0.053518   9391.793421
2018-05-07 21:53:47.322 -0.046302   9391.793421
2018-05-07 21:53:49.182 0.100000    9391.800000
我想做的是以5秒的间隔对行进行分组,并对每个5秒的间隔/子集执行(有时是复杂的)计算

比如说,我想计算A列中每5秒块内正值和负值的百分比

2018-05-07 21:53:10
2018-05-07 21:53:15
仅包含一行,列A为正数,因此我将创建一个
100%的新列C

类似地,
2018-05-07 21:53:15
2018-05-07 21:53:20
在A列中有8行,其中7行为正,1行为负。因此,C列将是
87.5%

我会发布示例代码,但我真的不确定最好的方法。样本输出(新df)可能如下所示,D列只是5秒分组的B列中的最小数:

INDEX               COL C     COL D (MIN)
2018-05-07 21:53:10 100%     9391.800000
2018-05-07 21:53:15 12.5%    9391.793421
2018-05-07 21:53:20 100%     9391.800000
2018-05-07 21:53:25 66.7%    9391.793421
2018-05-07 21:53:30 nan      nan
2018-05-07 21:53:35 nan      nan
2018-05-07 21:53:40 nan      nan
2018-05-07 21:53:45 100%     9391.793421
请记住,我想对每个分组进行许多不同的计算。因此,使用内置的
.sum()
.mean()
.agg()
等不足以进行更复杂的计算


感谢您的帮助,如果需要的话,我很乐意澄清这个问题。

我认为需要正值的百分比需要值的平均值
>0

df = df.resample('5S').agg({'COL A': lambda x: (x > 0).mean() * 100, 'COL B': 'min'})
print (df)
                          COL A        COL B
INDEX                                       
2018-05-07 21:53:10  100.000000  9391.800000
2018-05-07 21:53:15   87.500000  9391.793421
2018-05-07 21:53:20  100.000000  9391.800000
2018-05-07 21:53:25   66.666667  9391.793421
2018-05-07 21:53:30         NaN          NaN
2018-05-07 21:53:35         NaN          NaN
2018-05-07 21:53:40         NaN          NaN
2018-05-07 21:53:45   50.000000  9391.793421

至于负值的百分比需要
的平均值,我对第一列有点困惑,你能解释一下吗?我相信你在描述中引用了错误的列。B列总是正值。此外,对于pos vs neg,我认为在第二个示例中正确的值应该是87.5%(7/8),而不是12.5%。Alexander有,我错了。
lambda x:x.ne(0)。mean()*100
?(否则你会将零值视为正值)@Alexander-谢谢,我在想如果
0
应该是
负值
正值
。我相信你首先要过滤组以删除任何零值,因为它既不是正值也不是负值。然后使用
.gt(0)
返回正数值的数组,并取平均值以获得正数值的非零值百分比
lambda x:x[x.ne(0)].gt(0).mean()*100
它将告诉您组外的正值数量,但由于您的组包含零,我认为百分比不正确。用[0.7,0.4,0,-0.2]试试。结果应该是0.666(三个非零值中有两个正值)。顺便说一句,这是根据经验得出的。。。我已经分析了很多零的数据(实际上应该是NaN值)。过滤掉它们是正确的,并且在“坏”数据的情况下防止向上偏移。
df = df.resample('5S').agg({'COL A': lambda x: (x < 0).mean() * 100, 'COL B': 'min'})
print (df)
                         COL A        COL B
INDEX                                      
2018-05-07 21:53:10   0.000000  9391.800000
2018-05-07 21:53:15  12.500000  9391.793421
2018-05-07 21:53:20   0.000000  9391.800000
2018-05-07 21:53:25  33.333333  9391.793421
2018-05-07 21:53:30        NaN          NaN
2018-05-07 21:53:35        NaN          NaN
2018-05-07 21:53:40        NaN          NaN
2018-05-07 21:53:45  50.000000  9391.793421
df = df.resample('5S').agg({'COL A': lambda x: (x[x.ne(0)] > 0).mean() * 100, 'COL B': 'min'})