从 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 脚本》

问答搜集

https://stackoverflow.com/questions/63265424/java-loop-trough-a-csv-file-checking-for-missing-meter-readings-based-on-the-t