You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:55:08