Python如何对毫秒级时间戳数据集按每5秒窗口计算数值均值
原有代码问题分析
- 列名不匹配:你读取CSV时指定的
col_list列名和数据集实际表头pid_col/timestamp_col/value_col不对应,会直接读取报错。 - 时间解析参数错误:你的时间列是标准的带高精度小数秒的字符串格式,不需要加
unit='ms'参数,该参数仅用于时间戳为数字的场景,加了会导致时间解析结果完全错误。 - 时间窗口对齐不符合要求:默认的
pd.Grouper(freq='5S')会将窗口对齐到整除5秒的时间刻度,无法匹配你要求的首个窗口从07:14:56开始的规则。
正确实现代码
import pandas as pd from pandas import Grouper # 1. 读取数据,匹配实际列名,可按需重命名 df = pd.read_csv("data.csv", usecols=["pid_col", "timestamp_col", "value_col"]) df.columns = ["pid", "timestamp", "value"] # 2. 正确解析高精度时间 df['timestamp'] = pd.to_datetime(df['timestamp']) # 3. 按指定规则分组聚合:origin参数指定首个窗口左边界,后续自动推移5秒 # 若需要窗口包含左右两端边界,可增加closed='both'参数 df = df.groupby( ['pid', Grouper(freq='5S', key='timestamp', origin=pd.Timestamp('2019-03-29 07:14:56'))], as_index=False ).agg( window_start_time=('timestamp', 'first'), value_avg=('value', 'mean') )
低版本pandas兼容方案
如果使用的pandas版本低于1.3.0不支持origin参数,可通过时间偏移实现相同效果:
import pandas as pd from pandas import Grouper df = pd.read_csv("data.csv", usecols=["pid_col", "timestamp_col", "value_col"]) df.columns = ["pid", "timestamp", "value"] df['timestamp'] = pd.to_datetime(df['timestamp']) # 时间偏移后按默认5秒分组,还原后即可匹配需求边界 df['shifted_ts'] = df['timestamp'] - pd.Timedelta(seconds=1) df = df.groupby( ['pid', Grouper(freq='5S', key='shifted_ts')], as_index=False ).agg( window_start_time=('timestamp', 'first'), value_avg=('value', 'mean') )
内容的提问来源于stack exchange,提问作者saeede
相关产品推荐
相关产品推荐

