pandas计算分组平均时重置时间

0 投票
1 回答
47 浏览
提问于 2025-04-14 16:04

我有一个数据表,里面有“时间”和“速度”这两列。我想计算每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

撰写回答