我只是想多了解一点石斑鱼
。我知道调用频率
会使某些函数无效。但我想知道在使用grouper
时是否有解决办法来计算最后一段。例如,我希望 max
计数包含下面 df
的 13:30:00 和 13:45:00
之间的 15 分钟段.
df = pd.DataFrame({
'Time' : ['1904-01-01 13:00:00','1904-01-01 13:10:00','1904-01-01 13:15:00','1904-01-01 13:25:00','1904-01-01 13:35:00'],
'Number' : [2,2,1,1,1],
})
df['Time'] = pd.to_datetime(df['Time'])
df = df.groupby(pd.Grouper(freq='15T', key='Time', closed = 'left'))['Number'].max().ffill()
df = df.reset_index(level=['Time'])
输出:
Time Number
0 1904-01-01 13:00:00 2
1 1904-01-01 13:15:00 1
2 1904-01-01 13:30:00 1
这可以通过使用label = 'right'
来实现。但输出是:
Time Number
0 1904-01-01 13:15:00 2
1 1904-01-01 13:30:00 1
2 1904-01-01 13:45:00 1
我希望返回df
:
Time Number
0 1904-01-01 13:00:00 2
1 1904-01-01 13:15:00 1
2 1904-01-01 13:30:00 1
3 1904-01-01 13:45:00 1
最佳答案
我在 pandas 0.24.2 中得到不同的输出:
df = df.groupby(pd.Grouper(freq='15T', key='Time', closed = 'right'))['Number'].max().ffill()
df = df.reset_index(level=['Time'])
print (df)
Time Number
0 1904-01-01 12:45:00 2
1 1904-01-01 13:00:00 2
2 1904-01-01 13:15:00 1
3 1904-01-01 13:30:00 1
标签可以按 label='right'
移动,但值没有改变:
df = (df.groupby(pd.Grouper(freq='15T', key='Time', label='right', closed = 'right'))['Number']
.max().ffill())
#resample alternative
df2 = df.resample('15T', on='Time', label='right', closed='right')['Number'].max().ffill()
df2 = df.reset_index(level=['Time'])
print (df2)
Time Number
0 1904-01-01 13:00:00 2
1 1904-01-01 13:15:00 2
2 1904-01-01 13:30:00 1
3 1904-01-01 13:45:00 1
更多信息请参见 how to understand closed and label arguments in pandas resample method? ,因为 Grouper
使用相同的逻辑,并且大多数参数是相同的。
您的问题的可能解决方案是添加新行,并将最大日期时间移动15分钟
:
df1 = pd.DataFrame({'Time': df['Time'].max() + pd.Timedelta('15T'),
'Number':df['Number'].iat[-1]}, index=[0])
print (df1)
Time Number
0 1904-01-01 13:50:00 1
df = df.append(df1).groupby(pd.Grouper(freq='15T', key='Time'))['Number'].max()
df = df.reset_index(level=['Time'])
print (df)
Time Number
0 1904-01-01 13:00:00 2
1 1904-01-01 13:15:00 1
2 1904-01-01 13:30:00 1
3 1904-01-01 13:45:00 1
关于pandas - 考虑最后一组与 groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57335596/