从 csv 保存的间隔固定的时间序列中找出缺失项
例题描述和简单分析
有 csv 文件 csv.csv,数据如下所示:
2020-07-29 00:00:00
2020-07-29 01:00:00
2020-07-29 02:00:00
2020-07-29 03:00:00
2020-07-29 04:00:00
2020-07-29 05:00:00
2020-07-29 06:00:00
2020-07-29 07:00:00
2020-07-29 08:00:00
2020-07-29 10:00:00
2020-07-29 11:00:00
2020-07-29 12:00:00
2020-07-29 13:00:00
2020-07-29 14:00:00
2020-07-29 15:00:00
2020-07-29 16:00:00
2020-07-29 17:00:00
2020-07-29 18:00:00
2020-07-29 19:00:00
2020-07-29 20:00:00
2020-07-29 22:00:00
2020-07-29 23:00:00
2020-07-30 00:00:00
2020-07-30 01:00:00
2020-07-30 02:00:00
2020-07-30 03:00:00
2020-07-30 04:00:00
2020-07-30 05:00:00
2020-07-30 06:00:00
2020-07-30 07:00:00
2020-07-30 08:00:00
2020-07-30 09:00:00
2020-07-30 10:00:00
2020-07-30 11:00:00
2020-07-30 12:00:00
从 2020-07-29 00:00:00 至 2020-07-30 12:00:00,已排序,以 1 小时为间隔,理论上每天 24 条,但实际上有遗漏,需要找出遗漏的日期时间,结果如下:
2020-07-29 09:00:00
2020-07-29 21:00:00
解法及简要说明
方法1:差集
在集算器中编写脚本 p1.dfx,如下所示:
A |
|
1 |
=file("csv.csv").import@i() |
2 |
=periods@s(A1(1),A1.m(-1),3600) |
3 |
=A2\A1 |
简要说明:
A1 读取 csv 文件中的日期时间数据
A2 列出从第一个日期时间至最后一个日期时间间隔为 3600 秒(1 小时)的所有日期时间
A3 计算 A2 与 A1 的差集
方法2:循环
在集算器中编写脚本 p1.dfx,如下所示:
A |
|
1 |
=file("csv.csv").import@i() |
2 |
=A1.conj(if(#>1 && interval@s(~[-1],~)>3600, periods@xs(elapse@s(~[-1],3600),~,3600))) |
简要说明:
A1 读取 csv 文件中的日期时间数据
A2 遍历 A1,从第二个日期时间开始,若上一个日期时间与当前日期时间间隔超过 3600 秒(1 小时),则计算从上一个日期时间后的3600 秒(1 小时)的日期时间至当前日期时间间隔为 3600 秒(1 小时)的所有日期时间,periods 的 @x 表示不包含后端点
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
英文版