我有一个数据框,日期时间为索引,有2列。
我想要做的是将df分成几天, 将那些日子分成第2列的值等于/高于70的块, 并计算该期间第1列的持续时间(指数)和平均值。
我可以想办法做到这一点,但那些包括字典和丑陋的循环或者来自itertools的groupby,所以我更喜欢一种更为自然的解决方案。
我已经使用以下内容拆分我的大型数据框:for x in df.groupby(pd.Grouper(freq='24H', base=12))
,将它们拆分为下面发布的chuncks
2018-04-13 12:00:00 11.4 70.0
2018-04-13 13:00:00 11.3 73.0
2018-04-13 14:00:00 10.6 70.0
2018-04-13 15:00:00 11.2 67.0
2018-04-13 16:00:00 10.4 67.0
2018-04-13 17:00:00 10.8 66.0
2018-04-13 18:00:00 10.8 67.0
2018-04-13 19:00:00 10.8 67.0
2018-04-13 20:00:00 10.7 69.0
2018-04-13 21:00:00 10.3 70.0
2018-04-13 22:00:00 10.1 71.0
2018-04-13 23:00:00 9.8 73.0
2018-04-14 00:00:00 9.4 75.0
2018-04-14 01:00:00 9.1 77.0
2018-04-14 02:00:00 8.6 80.0
2018-04-14 03:00:00 7.8 84.0
2018-04-14 04:00:00 7.3 87.0
2018-04-14 05:00:00 8.3 87.0
2018-04-14 06:00:00 8.3 88.0
2018-04-14 07:00:00 8.6 88.0
2018-04-14 08:00:00 9.0 87.0
2018-04-14 09:00:00 11.3 83.0
2018-04-14 10:00:00 12.2 81.0
2018-04-14 11:00:00 12.4 82.0
我需要:(不是这种格式,只是示例)
2018-04-13 12:00:00 - 3 hours - 71.0
2018-04-13 21:00:00 - 14 hours - 80.86
对此问题有任何干净的建议吗?它与this有关,但我无法将其转换为我的例子。
我还要过滤掉第2列< 70,但是我再次无法获得连续性
编辑:我的最终解决方案
df['Time'] = df.index
for day, daydf in df.groupby(pd.Grouper(freq='24H', base=12)):
df_filtered = daydf[daydf['v2'] >= 70]
grouping_key = df_filtered.Time.diff().dt.total_seconds().ne(3600).cumsum()
grouper = df_filtered.groupby(grouping_key)
aggregated_data = grouper.agg({'Time': 'first', 'v1': 'mean', 'v2': len})
print(aggregated_data)
答案 0 :(得分:2)
使用过滤后,您可以groupby
与diff
一起使用,查找续系列并将其分配到同一组,然后您拥有此组密钥,我们可以使用groupby
+ { {1}}
agg
数据输入
s.groupby(s.Time.diff().dt.total_seconds().ne(3600).cumsum()).agg({'Time':'first','v2':'mean','v1':len})
Out[701]:
Time v2 v1
Time
1 2018-04-13 12:00:00 71.000000 3.0
2 2018-04-13 21:00:00 71.333333 3.0