使用Python Pandas将秒级数据转换为分钟级均值数据
需求说明
我有一份86000+行的秒级时序数据,时间范围覆盖2022-07-01至2022-07-02,原始数据格式如下:
Datetime Data1 Data2 ... Data85 Data86
2022-07-01 23:57:39 9.831 4.984511 ... -0.01333 0.74176
2022-07-01 23:57:40 9.426 4.984511 ... -0.01333 0.73347
...
2022-07-02 23:57:41 9.605 4.984511 ... -0.01333 0.74576
2022-07-02 23:57:42 9.605 4.984511 ... -0.01333 0.74576
需要将每分钟内的所有秒级数据按列求均值(求和后除以该分钟内的数据条数),转换为分钟级数据,目标格式如下:
Datetime Data1 Data2 ... Data85 Data86
2022-07-01 23:57 9.831 4.984511 ... -0.01333 0.74176
2022-07-01 23:58 9.821 4.984611 ... -0.01333 0.74176
...
2022-07-02 23:59 ...
方法1:Python Pandas实现
这是处理时序数据最便捷的方式,代码示例:
import pandas as pd # 读取数据(空格分隔格式,可根据实际调整分隔符) df = pd.read_csv('your_data.csv', sep='\s+', parse_dates=['Datetime']) # 按分钟重采样并计算均值 df_resampled = df.set_index('Datetime').resample('T').mean().reset_index() # 格式化时间列为"YYYY-MM-DD HH:MM"格式 df_resampled['Datetime'] = df_resampled['Datetime'].dt.strftime('%Y-%m-%d %H:%M') # 保存结果 df_resampled.to_csv('minute_avg_data.csv', sep='\t', index=False)
resample('T')自动按分钟分组,mean()直接计算每列均值,无需手动处理数据条数- 若原始数据是其他格式(如Excel),可替换为
pd.read_excel()
方法2:SQL实现(适用于数据库存储的数据)
如果数据存储在数据库中,直接用分组聚合语句:
SELECT DATE_FORMAT(Datetime, '%Y-%m-%d %H:%i') AS Datetime, AVG(Data1) AS Data1, AVG(Data2) AS Data2, -- 依次写出Data3到Data86的AVG语句 AVG(Data85) AS Data85, AVG(Data86) AS Data86 FROM your_table WHERE Datetime BETWEEN '2022-07-01 00:00:00' AND '2022-07-02 23:59:59' GROUP BY DATE_FORMAT(Datetime, '%Y-%m-%d %H:%i') ORDER BY Datetime;
- 不同数据库的时间格式化函数需调整:PostgreSQL用
TO_CHAR(Datetime, 'YYYY-MM-DD HH24:MI'),SQL Server用FORMAT(Datetime, 'yyyy-MM-dd HH:mm') AVG()函数自动处理每组数据的均值计算
方法3:Shell脚本实现(适用于纯文本文件)
针对本地空格分隔的文本文件,用awk处理:
awk ' BEGIN { OFS="\t" prev_minute="" } NR == 1 { print $0; next } # 打印表头 { # 提取分钟级时间 split($1, date_parts, "-") split($2, time_parts, ":") current_minute = date_parts[1] "-" date_parts[2] "-" date_parts[3] " " time_parts[1] ":" time_parts[2] if (current_minute != prev_minute) { # 输出上一分钟的均值 if (prev_minute != "") { printf "%s", prev_minute for (i=2; i<=NF; i++) { printf "%s%.6f", OFS, sum[i]/count } printf "\n" } # 重置统计变量 count = 0 delete sum prev_minute = current_minute } # 累加每列数据 count++ for (i=2; i<=NF; i++) { sum[i] += $i } } END { # 输出最后一分钟的均值 printf "%s", prev_minute for (i=2; i<=NF; i++) { printf "%s%.6f", OFS, sum[i]/count } printf "\n" }' your_data.txt > minute_avg_data.txt
- 脚本逐行读取数据,按分钟分组累加求和,最后计算均值输出,保持原始格式
内容的提问来源于stack exchange,提问作者Apy_dum

