我有包含以下元素的 CSV 文件:
timestamp, data1, data2, data3, data4, data5
2015-03-16 00:00:00, 3, 3, 4, 2, 5
2015-03-16 00:10:00, 4, 7, 8, 9, 3
2015-03-16 00:20:00, 1, 23, , 5, 4
2015-03-16 00:30:00, 3, 2, 46, 7, 6
2015-03-16 00:40:00, 4, 5, 6, 8, 4
2015-03-16 00:50:00, 2, , 4, , 2
2015-03-16 01:00:00, 22, 1, 3, 4, 3
2015-03-16 01:50:00, 3, , 7, 8, 89
2015-03-16 02:00:00, 44, 5, 6, 7,
2015-03-16 02:10:00, 3, 2, 1, 2, 2
2015-03-16 02:20:00, 4, , , 3, 3
2015-03-16 03:30:00, 5, 6, 7, 4, 3
我想添加缺少的时间戳并NaN
在数据不存在的地方填充数据字段,如下所示:
timestamp, data1, data2, data3, data4, data5
2015-03-16 00:00:00, 3, 3, 4, 2, 5
2015-03-16 00:10:00, 4, 7, 8, 9, 3
2015-03-16 00:20:00, 1, 23, NaN, 5, 4
2015-03-16 00:30:00, 3, 2, 46, 7, 6
2015-03-16 00:40:00, 4, 5, 6, 8, 4
2015-03-16 00:50:00, 2, NaN, 4, NaN, 2
2015-03-16 01:00:00, 22, 1, 3, 4, 3
2015-03-16 01:10:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 01:20:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 01:30:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 01:40:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 01:50:00, 3, NaN, 7, 8, 89
2015-03-16 02:00:00, 44, 5, 6, 7, NaN
2015-03-16 02:10:00, 3, 2, 1, 2, 2
2015-03-16 02:20:00, 4, NaN, NaN, 3, 3
2015-03-16 02:30:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 02:40:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 02:50:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 03:00:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 03:10:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 03:20:00, NaN, NaN, NaN, NaN, NaN
2015-03-16 03:30:00, 5, 6, 7, 4, 3
我怎样才能做到这一点?请注意,这会持续几天,而不是一天。为简单起见,我使用了一天的数据。我正在使用 Cygwin,谢谢。
我在下面使用 Miller 而不是
awk
因为没有实现对时间戳解析有任何真正的支持,并且除了简单的CSV(没有嵌入式分隔符或换行符)awk
之外不支持解析 CSV 。使用Miller (
mlr
) 解析 CSV,清理空格,生成缺失的时间戳,最后用字符串替换缺失值NaN
:该
clean-whitespace
操作从所有字段中删除所有侧翼空格并将所有连续的内部空格压缩为单个空格。两个
put
表达式中的第一个生成丢失的时间戳。它通过跟踪@t
(使用 Unix 时间)中的“当前时间”并以 600 秒(10 分钟)为步长向前推进直到它对应于从输入中读取的时间戳来实现t1
。对于每个步骤,时间戳的输出格式与文件中的格式相同。为此,这显然假设每个输入时间戳以 10 分钟的间隔出现。由于第一个
put
表达式生成的新记录缺少除 之外的所有字段timestamp
,因此我们使用它unsparsify
来添加缺少的字段。第二个
put
表达式遍历所有字段并将每个空字段设置为 stringNaN
。输出,给定问题中的数据: