我有一些间隔1分钟的营销数据。 作为csv-table的示例,每行代表每分钟的最大值:
time ch1 ch2 ch3 ch4
20:03 1754 539 149 1337
20:04 2073 576 160 1448
20:05 2246 599 176 1515
20:06 2246 637 176 1531
20:07 2457 651 183 1549
20:08 2564 677 184 1655
20:09 2624 712 191 1699
20:10 2742 717 194 1672
20:11 2788 714 199 1675
20:12 2792 693 186 1680
20:13 2914 708 188 1672
20:14 3067 715 194 1685
20:15 3067 725 196 1682
另外,我需要找到每5分钟的最大值。因此,我需要找到每列5行(或更少 - 如果没有剩余行数)的最大值,并将其插入新的5分钟行。
我希望收到的信息(例如):
每个新行必须代表5的最大值
time ch1 ch2 ch3 ch4
20:03 2564 677 184 1655
20:08 2914 717 199 1699
20:13 3067 725 196 1685
老实说,我已经搜索过但没有结果。
Python中是否有适合我任务的优雅解决方案? 谢谢你的帮助!
答案 0 :(得分:4)
g = df.groupby(np.arange(len(df)) // 5)
g.max().assign(time=g.time.first())
time ch1 ch2 ch3 ch4 ch5
0 20:03 2457 651 183 1549 4840
1 20:08 2792 717 199 1699 5376
2 20:13 3067 725 196 1685 5670
答案 1 :(得分:4)
使用您的输入:
df['group']=df.index//5
target=df.groupby('group').agg(max)
target['time']=df.groupby('group').time.agg(min)
Out[511]:
time ch1 ch2 ch3 ch4 ch5
group
0 20:03 2457 651 183 1549 4840
1 20:08 2792 717 199 1699 5376
2 20:13 3067 725 196 1685 5670
答案 2 :(得分:3)
我将假设你没有将你的值转换为datetime
,因为你指定这是一个csv数据表,所以我将索引转换为datetime
。
df.index = pd.to_datetime(df.time,format='%H:%M')
既然索引是datetime
格式,我们可以使用resample
按5分钟的间隔进行分组。注意:我将这里的基数设置为3,因为这是你想要格式化的方式,但是我认为从长远来看你可能更适合将它保留为0.所以要对数据进行分组运行
df.resample('5T',base=3).max().drop('time',1)
要将基数动态设置为第一分钟值,请使用
df.resample('5T',base=int(df.time.values[0][-1:])).max().drop('time',1)
收益率
ch1 ch2 ch3 ch4
time
2017-09-20 20:03:00 2457 651 183 1549
2017-09-20 20:08:00 2792 717 199 1699
2017-09-20 20:13:00 3067 725 196 1685
如果您不想在索引中运行日期
df.index = df.index.time
但是,您需要包含重新取样的日期
ch1 ch2 ch3 ch4
20:03:00 2457 651 183 1549
20:08:00 2792 717 199 1699
20:13:00 3067 725 196 1685