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
相关产品推荐
相关产品推荐

