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

AWK脚本无法补全10分钟间隔时序数据缺失值,求解决方案

时序数据缺失填充问题解决

问题背景

有一份按10分钟间隔采集的时序数据文件,存在部分数据缺失,需要补全2001/1/1 0:00至2001/1/1 3:00区间内的缺失数据,填充值为nan。

原始数据文件(ifile.txt)

cat << EOF > ifile.txt
2001/1/1 0:00 3
2001/1/1 0:10 32
2001/1/1 0:40 17
2001/1/1 0:50 4.402
2001/1/1 1:00 3.95
2001/1/1 1:50 1.42
2001/1/1 2:00 0.34
2001/1/1 2:10 0
2001/1/1 2:20 9
2001/1/1 2:30 57
EOF

原脚本问题

编写的脚本未输出缺失数据,仅打印原输入文件:

awk 'BEGIN {
    FS=OFS=" ";
    start_time = mktime("200101010000");
      end_time = mktime("200101010300");
current_minutes = 0;
}
{
    entry_time = mktime(gensub(/[:\/]/, " ", "g", $1" "$2));
    while (current_minutes < (entry_time - start_time) / 60) {
        printf "%s %02d:%02d nan\n", strftime("%Y/%m/%d", start_time), int(current_minutes / 60), current_minutes % 60;
        current_minutes += 10;
    }
    print $0;
    current_minutes += 10;
}
END {
    while (current_minutes <= (end_time - start_time) / 60) {
        printf "%s %02d:%02d nan\n", strftime("%Y/%m/%d", start_time), int(current_minutes / 60), current_minutes % 60;
        current_minutes += 10;
    }
}' ifile.txt

问题根源

原脚本中gensub转换后的时间格式不符合mktime要求:mktime需要YYYY MM DD HH MM SS的6字段格式,但原替换仅生成5字段(缺少秒数),导致mktime返回错误值(通常为-1),后续时间差计算异常,填充缺失数据的循环无法触发。

修正后的脚本

通过拆分日期时间字段补全秒数,同时用时间戳直接步进替代分钟数计算,避免格式错误:

awk 'BEGIN {
    FS=OFS=" ";
    start_time = mktime("2001 01 01 00 00 00");
    end_time = mktime("2001 01 01 03 00 00");
    current_time = start_time;
}
{
    # 拆分日期和时间,转换为mktime兼容格式
    split($1, date, "/");
    split($2, time, ":");
    entry_time = mktime(sprintf("%d %02d %02d %02d %02d 00", date[1], date[2], date[3], time[1], time[2]));
    
    # 填充当前时间到输入数据时间之间的缺失项
    while (current_time < entry_time) {
        printf "%s %02d:%02d nan\n", 
               strftime("%Y/%m/%d", current_time), 
               strftime("%H", current_time), 
               strftime("%M", current_time);
        current_time += 10*60; # 每次增加10分钟(600秒)
    }
    
    print $0;
    current_time += 10*60;
}
END {
    # 填充最后一条数据到结束时间的缺失项
    while (current_time <= end_time) {
        printf "%s %02d:%02d nan\n", 
               strftime("%Y/%m/%d", current_time), 
               strftime("%H", current_time), 
               strftime("%M", current_time);
        current_time += 10*60;
    }
}' ifile.txt

执行后输出

2001/1/1 0:00 3
2001/1/1 0:10 32
2001/1/1 0:20 nan
2001/1/1 0:30 nan
2001/1/1 0:40 17
2001/1/1 0:50 4.402
2001/1/1 1:00 3.95
2001/1/1 1:10 nan
2001/1/1 1:20 nan
2001/1/1 1:30 nan
2001/1/1 1:40 nan
2001/1/1 1:50 1.42
2001/1/1 2:00 0.34
2001/1/1 2:10 0
2001/1/1 2:20 9
2001/1/1 2:30 57
2001/1/1 2:40 nan
2001/1/1 2:50 nan
2001/1/1 3:00 nan

内容的提问来源于stack exchange,提问作者Kay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:02:03