This repository was archived by the owner on Dec 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocess-cloud-cover-data.ts
More file actions
54 lines (47 loc) · 1.45 KB
/
process-cloud-cover-data.ts
File metadata and controls
54 lines (47 loc) · 1.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import { z } from "https://deno.land/x/zod/mod.ts";
import dayjs from "npm:dayjs";
import { readCSV } from "https://deno.land/x/csv/mod.ts";
const CsvRow = z.object({
date: z.string(),
time: z.preprocess((s) => Number(s), z.number().int()),
cloudCover: z.preprocess(
(s) => Number.parseFloat(s as string),
z.number().gte(0).lte(1),
),
});
type CsvRow = z.infer<typeof CsvRow>;
const fileName = "cloud-cover.csv";
const excludeStartHour = 6;
const excludeEndHour = 18;
const data: CsvRow[] = [];
const f = await Deno.open(fileName);
for await (const row of readCSV(f, { fromLine: 1 })) {
const rowList = [];
for await (const cell of row) {
rowList.push(cell);
}
const [date, time, cloudCover] = rowList;
const parsedRow = CsvRow.parse({ date, time, cloudCover });
const hour = dayjs.unix(parsedRow.time).hour();
if (hour < excludeStartHour || hour > excludeEndHour) {
data.push(parsedRow);
}
}
f.close();
const dateMap = new Map<string, Omit<CsvRow, "date">[]>();
for (const { date, time, cloudCover } of data) {
dateMap.set(date, [...(dateMap.get(date) || []), { time, cloudCover }]);
}
const maxCloudCoverage: CsvRow[] = [];
for (const [date, rows] of dateMap.entries()) {
const sorted = rows.sort((a, b) => b.cloudCover - a.cloudCover);
maxCloudCoverage.push({
date,
time: sorted[0].time,
cloudCover: sorted[0].cloudCover,
});
}
console.log(maxCloudCoverage);
for (const row of maxCloudCoverage) {
console.log(row);
}