pandas计算分组平均时重置时间
我有一个数据表,里面有“时间”和“速度”这两列。我想计算每10秒的平均速度。下面这行代码可以做到这一点,但它把时间重置成了从00:00:00开始。
df.groupby(pd.Grouper(freq='10S', base=30, label='right')).mean()
这是我开始时的数据表:
索引 | 速度 |
---|---|
14:01:01 | 1 |
14:01:02 | 1.2 |
14:01:03 | 1 |
14:01:04 | 1.2 |
而输出的表格是:
索引 | 速度 |
---|---|
00:00:00 | 1.1 |
但索引的值应该是14:01:00,而不是00:00:00。
1 个回答
0
最简单的方法是把时间这一列设置为索引,这样你就可以使用分组功能(groupby)了:
import pandas as pd
from io import StringIO
data = """
Time,Speed
14:01:01,1
14:01:02,1.2
14:01:03,1
14:01:04,1.2
14:01:31,1.3
14:01:33,1.4
14:01:41,1.1
14:01:42,1.2
"""
df = pd.read_csv(StringIO(data))
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S')
df.set_index('Time', inplace=True)
offset = 30
df['seconds'] = (df.index.second - offset) % 60
df['group'] = (df.index - pd.to_timedelta(df['seconds'], unit='s'))
result = df.groupby('group')['Speed'].mean().reset_index()
result['group'] = result['group'] + pd.to_timedelta(offset, unit='s')
result.set_index('group', inplace=True)
result.index.name = 'Time'
print(result)
这样你就能得到
Speed
Time
1900-01-01 14:01:00 1.10
1900-01-01 14:02:00 1.25
如果你只想保留时间(去掉日期),可以这样修改代码:
import pandas as pd
from io import StringIO
data = """
Time,Speed
14:01:01,1
14:01:02,1.2
14:01:03,1
14:01:04,1.2
14:01:31,1.3
14:01:33,1.4
14:01:41,1.1
14:01:42,1.2
"""
df = pd.read_csv(StringIO(data))
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S')
df.set_index('Time', inplace=True)
offset = 30
df['seconds'] = (df.index.second - offset) % 60
df['group'] = (df.index - pd.to_timedelta(df['seconds'], unit='s'))
result = df.groupby('group')['Speed'].mean().reset_index()
result['group'] = result['group'] + pd.to_timedelta(offset, unit='s')
result['Time'] = result['group'].dt.time
result.drop('group', axis=1, inplace=True)
result.set_index('Time', inplace=True)
print(result)
这样你就能得到
Speed
Time
14:01:00 1.10
14:02:00 1.25