I know how to apply conditional filling thanks to this post. That post works for two different columns from same data set/array (in that case, VALUE1 and VALUE2 columns from rawdata2 array). I would like to apply conditional filling for same column taken from two different dataset/array (in my case, VALUEORI column from rawdata_n array and VALUEORI column for rawdata_AAn array). To do so, I updated answer from @pernifloss:
// For rawdata_n
let separated_n = rawdata_n.reduce((a, b, index) => {
let sub = b.VALUEORI;
if (sub > 0) {
return { positive: [...a.positive, { ...b, index }], negative: [...a.negative] };
}
return { positive: [...a.positive], negative: [...a.negative, { ...b, index }] };
}, { positive: [], negative: [] });
const positiveSets_n = [];
let previous_n = undefined;
separated_n.positive.forEach((e) => {
// If not contiguous
if (!previous_n || previous_n.index + 1 !== e.index) {
// Create a new set
positiveSets_n.push([e]);
} else {
// Append value to the previous set
positiveSets_n[positiveSets_n.length - 1] = [...positiveSets_n[positiveSets_n.length - 1], e];
}
previous_n = e;
});
const negativeSets_n = [];
previous_n = undefined;
separated_n.negative.forEach((e) => {
if (!previous_n || previous_n.index + 1 !== e.index) {
negativeSets_n.push([e]);
} else {
negativeSets_n[negativeSets_n.length - 1] = [...negativeSets_n[negativeSets_n.length - 1], e];
}
previous_n = e;
});
const posG_n = svg.selectAll('.positive').data(positiveSets_n);
posG_n.enter().append('path')
.attr('class', 'positive')
.attr('fill', 'blue') // "positive" color
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
const negG_n = svg.selectAll('.negative').data(negativeSets_n);
negG_n.enter().append('path')
.attr('class', 'negative') // "negative" color
.attr('fill', 'red')
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
// For rawdata_AAn
let separated_AAn = rawdata_AAn.reduce((a, b, index) => {
let sub = b.VALUEORI;
if (sub > 0) {
return { positive: [...a.positive, { ...b, index }], negative: [...a.negative] };
}
return { positive: [...a.positive], negative: [...a.negative, { ...b, index }] };
}, { positive: [], negative: [] });
const positiveSets_AAn = [];
let previous_AAn = undefined;
separated_AAn.positive.forEach((e) => {
// If not contiguous
if (!previous_AAn || previous_AAn.index + 1 !== e.index) {
// Create a new set
positiveSets_AAn.push([e]);
} else {
// Append value to the previous set
positiveSets_AAn[positiveSets_AAn.length - 1] = [...positiveSets_AAn[positiveSets_AAn.length - 1], e];
}
previous_AAn = e;
});
const negativeSets_AAn = [];
previous_AAn = undefined;
separated_AAn.negative.forEach((e) => {
if (!previous_AAn || previous_AAn.index + 1 !== e.index) {
negativeSets_AAn.push([e]);
} else {
negativeSets_AAn[negativeSets_AAn.length - 1] = [...negativeSets_AAn[negativeSets_AAn.length - 1], e];
}
previous_AAn = e;
});
const posG_AAn = svg.selectAll('.positive').data(positiveSets_AAn);
posG_AAn.enter().append('path')
.attr('class', 'positive')
.attr('fill', 'blue') // "positive" color
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
const negG_AAn = svg.selectAll('.negative').data(negativeSets_AAn);
negG_AAn.enter().append('path')
.attr('class', 'negative') // "negative" color
.attr('fill', 'red')
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
However, the resulting plot does not fill the area between the green and red line. I expect the are between those lines to be filled.
Here is my complete code:
<!--
This is an HTML document that includes a D3.js script. It starts with the head section where the document's title, character encoding, and D3.js library are included. Then, the document's body starts with a header h1 tag, followed by a script tag where the D3.js code is written.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>D3 CSV Example</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
</head>
<body>
<h1>D3 CSV Example</h1>
<script>
/* ++++++++++++++++++++++++ These are constant variables that define the dimensions of the visualization. The width and height variables define the overall dimensions of the SVG element that will contain the visualization. The margin variable is used to set a margin between the SVG element and the chart. The innerRadius and outerRadius variables define the radii of the two circles that will be used to represent the data. ++++++++++++++++ */
const width = 954;
const height = width;
const margin = 10;
const innerRadius = width / 5;
const outerRadius = width / 2 - margin;
/* ++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++ +++++++++++++++++++++++++++++*/
// ++++++++++++++++++++++++++++++++++++++++ Step 1) Parsing the CSV file ++++++++++++++++++++++++++++
d3.csv("v2_synthetic_data.csv", function(d) {
// Parse the CSV data and return a JavaScript object
// with the desired properties
return {
DATE_TIME: new Date(d.DATE_TIME),
ID: +d.ID,
VALUEORI: +d.VALUEORI,
VALUE2: +d.VALUE2,
INSPECTION: +d.INSPECTION,
STATE: +d.STATE,
};
}).then(function(rawdata) {
// Convert DATE_TIME column to minute-precise time
rawdata.forEach(function(d) {
const hour = d.DATE_TIME.getHours();
const minute = d.DATE_TIME.getMinutes();
d.minuteTime = hour * 60 + minute;
});
// console.log(rawdata)
const minuteScale = d3.scaleLinear()
.domain([0, 1439]) // 0 to 23:59 (24 hours * 60 minutes without -1 or else change to 1439 //- 1)
.range([0, 2 * Math.PI]);
const minuteTimeValues = rawdata.map(d => d.minuteTime);
const rawdata_n = rawdata.filter(function (d) {
return d.ID === 1 && d.INSPECTION === 1 && d.STATE === 0;
});
const rawdata_AAn = rawdata.filter(function (d) {
return d.ID === 1 && d.INSPECTION === 1 && d.STATE === 1;
});
// console.log(rawdata_n)
const x = d3.scaleTime()
.domain([0, 1439]) // Set the domain using the extent of the "minuteTime" values
.range([0, 2 * Math.PI]); // Set the desired range
// console.log(rawdata2)
const minValue1 = d3.min(rawdata_n, d => d.VALUEORI);
const minValue2 = d3.min(rawdata_AAn, d => d.VALUEORI);
const maxValue1 = d3.max(rawdata_n, d => d.VALUEORI);
const maxValue2 = d3.max(rawdata_AAn, d => d.VALUEORI);
const yMin = minValue1 < minValue2 ? minValue1 : minValue2;
const yMax = maxValue1 > maxValue2 ? maxValue1 : maxValue2;
// console.log(minValue1)
const y = d3.scaleLinear()
.domain([yMin, yMax])
.range([innerRadius, outerRadius]);
// Modify the xAxis generator to display only the hour and add padding
const xAxis = (g) => g
.attr("font-family", "sans-serif")
.attr("font-size", 10)
.call((g) => g.selectAll("g")
.data(d3.range(0, 24)) // create an array of hour values
.join("g")
.each((d, i) => d.id = `hour-${i}`)
.call((g) => g.append("path")
.attr("stroke", "#000")
.attr("stroke-opacity", 0.2)
.attr("d", (d) => `
M${d3.pointRadial(x(d * 60), innerRadius)}
L${d3.pointRadial(x(d * 60), outerRadius)}
`))
.call((g) => g.append("path")
.attr("id", (d) => `hour-${d}`)
.datum((d) => [d * 60, (d + 1) * 60])
.attr("fill", "none")
.attr("d", ([a, b]) => `
M${d3.pointRadial(x(a), innerRadius-10)}
A${innerRadius},${innerRadius} 0,0,1 ${d3.pointRadial(x(b), innerRadius)}
`))
.call((g) => g.append("text")
.append("textPath")
.attr("startOffset", 6)
.attr("href", (d) => `#hour-${d}`)
.text((d) => d.toString().padStart(2, "0"))
.attr("text-anchor", "middle")
.attr("alignment-baseline", "middle")
.attr("transform", (d) => {
const angle = x(d * 60);
const radius = innerRadius - 20; // reduce the radius to move the labels closer to the center
return `translate(${d3.pointRadial(x(d * 60), radius)})`;
})
)
);
const yAxis = g => g
.attr("text-anchor", "middle")
.attr("font-family", "sans-serif")
.attr("font-size", 10)
.call(g => g.selectAll("g")
.data(y.ticks().reverse())
.join("g")
.attr("fill", "none")
.call(g => g.append("circle")
.attr("stroke", "#000")
.attr("stroke-opacity", 0.2)
.attr("r", y))
.call(g => g.append("text")
.attr("y", d => -y(d))
.attr("dy", "0.35em")
.attr("stroke", "#fff")
.attr("stroke-width", 5)
.text((x, i) => `${x.toFixed(0)}${i ? "" : ""}`)
.clone(true)
.attr("y", d => y(d))
.selectAll(function() { return [this, this.previousSibling]; })
.clone(true)
.attr("fill", "currentColor")
.attr("stroke", "none")));
const line = d3.lineRadial()
.curve(d3.curveLinear)
.angle(d => x(d.minuteTime));
const area = d3.areaRadial()
.curve(d3.curveLinear)
.angle(d => x(d.minuteTime))
const svg = d3.create("svg")
.attr("viewBox", [-width / 2, -height / 2, width, height])
.attr("stroke-linejoin", "round")
.attr("stroke-linecap", "round");
svg.append("path")
.attr("fill", "none")
.attr("stroke", "red")
.attr("stroke-width", 3)
.attr("d", line
.radius(d => y(d.VALUEORI))
(rawdata_n));
svg.append("path")
.attr("fill", "none")
.attr("stroke", "green")
.attr("stroke-width", 3)
.attr("d", line
.radius(d => y(d.VALUEORI))
(rawdata_AAn));
// ++++++++++++++++++++++++++++++++ vv separate data in positive and negative value vv ++++++++++++++++++++++++++++++++
// For rawdata_n
let separated_n = rawdata_n.reduce((a, b, index) => {
let sub = b.VALUEORI;
if (sub > 0) {
return { positive: [...a.positive, { ...b, index }], negative: [...a.negative] };
}
return { positive: [...a.positive], negative: [...a.negative, { ...b, index }] };
}, { positive: [], negative: [] });
const positiveSets_n = [];
let previous_n = undefined;
separated_n.positive.forEach((e) => {
// If not contiguous
if (!previous_n || previous_n.index + 1 !== e.index) {
// Create a new set
positiveSets_n.push([e]);
} else {
// Append value to the previous set
positiveSets_n[positiveSets_n.length - 1] = [...positiveSets_n[positiveSets_n.length - 1], e];
}
previous_n = e;
});
const negativeSets_n = [];
previous_n = undefined;
separated_n.negative.forEach((e) => {
if (!previous_n || previous_n.index + 1 !== e.index) {
negativeSets_n.push([e]);
} else {
negativeSets_n[negativeSets_n.length - 1] = [...negativeSets_n[negativeSets_n.length - 1], e];
}
previous_n = e;
});
const posG_n = svg.selectAll('.positive').data(positiveSets_n);
posG_n.enter().append('path')
.attr('class', 'positive')
.attr('fill', 'blue') // "positive" color
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
const negG_n = svg.selectAll('.negative').data(negativeSets_n);
negG_n.enter().append('path')
.attr('class', 'negative') // "negative" color
.attr('fill', 'red')
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
// For rawdata_AAn
let separated_AAn = rawdata_AAn.reduce((a, b, index) => {
let sub = b.VALUEORI;
if (sub > 0) {
return { positive: [...a.positive, { ...b, index }], negative: [...a.negative] };
}
return { positive: [...a.positive], negative: [...a.negative, { ...b, index }] };
}, { positive: [], negative: [] });
const positiveSets_AAn = [];
let previous_AAn = undefined;
separated_AAn.positive.forEach((e) => {
// If not contiguous
if (!previous_AAn || previous_AAn.index + 1 !== e.index) {
// Create a new set
positiveSets_AAn.push([e]);
} else {
// Append value to the previous set
positiveSets_AAn[positiveSets_AAn.length - 1] = [...positiveSets_AAn[positiveSets_AAn.length - 1], e];
}
previous_AAn = e;
});
const negativeSets_AAn = [];
previous_AAn = undefined;
separated_AAn.negative.forEach((e) => {
if (!previous_AAn || previous_AAn.index + 1 !== e.index) {
negativeSets_AAn.push([e]);
} else {
negativeSets_AAn[negativeSets_AAn.length - 1] = [...negativeSets_AAn[negativeSets_AAn.length - 1], e];
}
previous_AAn = e;
});
const posG_AAn = svg.selectAll('.positive').data(positiveSets_AAn);
posG_AAn.enter().append('path')
.attr('class', 'positive')
.attr('fill', 'blue') // "positive" color
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
const negG_AAn = svg.selectAll('.negative').data(negativeSets_AAn);
negG_AAn.enter().append('path')
.attr('class', 'negative') // "negative" color
.attr('fill', 'red')
.attr("d", (d) => area
.innerRadius(d => y(d.VALUEORI))
.outerRadius(d => y(d.VALUEORI))
(d));
// ++++++++++++++++++++++++++++++++ ^^ separate data in positive and negative value ^^ ++++++++++++++++++++++++++++++++
svg.append("g")
.call(xAxis);
svg.append("g")
.call(yAxis);
const container = d3.select("body").append("div");
container.node().appendChild(svg.node());
});
</script>
</body>
</html>
In case you need, here is my CSV file:
DATE_TIME,ID,VALUEORI,VALUE2,INSPECTION,STATE
2022-11-01 00:00:00,1,116,87,1,0
2022-11-01 00:08:00,1,111,90,1,0
2022-11-01 00:16:00,1,120,72,1,0
2022-11-01 00:24:00,1,99,61,1,0
2022-11-01 00:32:00,1,90,83,1,0
2022-11-01 00:40:00,1,94,52,1,0
2022-11-01 00:48:00,1,94,65,1,0
2022-11-01 00:56:00,1,90,76,1,0
2022-11-01 01:04:00,1,101,79,1,0
2022-11-01 01:12:00,1,101,60,1,0
2022-11-01 01:20:00,1,104,84,1,0
2022-11-01 01:28:00,1,110,62,1,0
2022-11-01 01:36:00,1,92,60,1,0
2022-11-01 01:44:00,1,115,53,1,0
2022-11-01 01:52:00,1,119,87,1,0
2022-11-01 02:00:00,1,135,52,1,0
2022-11-01 02:08:00,1,90,77,1,0
2022-11-01 02:16:00,1,90,55,1,0
2022-11-01 02:24:00,1,131,87,1,0
2022-11-01 02:32:00,1,116,82,1,0
2022-11-01 02:40:00,1,123,55,1,0
2022-11-01 02:48:00,1,122,89,1,0
2022-11-01 02:56:00,1,126,80,1,0
2022-11-01 03:04:00,1,127,88,1,0
2022-11-01 03:12:00,1,132,82,1,0
2022-11-01 03:20:00,1,123,69,1,0
2022-11-01 03:28:00,1,105,63,1,0
2022-11-01 03:36:00,1,99,66,1,0
2022-11-01 03:44:00,1,126,81,1,0
2022-11-01 03:52:00,1,119,79,1,0
2022-11-01 04:00:00,1,130,77,1,0
2022-11-01 04:08:00,1,93,68,1,0
2022-11-01 04:16:00,1,124,62,1,0
2022-11-01 04:24:00,1,118,89,1,0
2022-11-01 04:32:00,1,126,52,1,0
2022-11-01 04:40:00,1,125,61,1,0
2022-11-01 04:48:00,1,108,85,1,0
2022-11-01 04:56:00,1,127,79,1,0
2022-11-01 05:04:00,1,94,57,1,0
2022-11-01 05:12:00,1,120,70,1,0
2022-11-01 05:20:00,1,121,69,1,0
2022-11-01 05:28:00,1,122,75,1,0
2022-11-01 05:36:00,1,91,59,1,0
2022-11-01 05:44:00,1,105,54,1,0
2022-11-01 05:52:00,1,99,52,1,0
2022-11-01 06:00:00,1,106,77,1,0
2022-11-01 06:08:00,1,113,75,1,0
2022-11-01 06:16:00,1,131,63,1,0
2022-11-01 06:24:00,1,100,65,1,0
2022-11-01 06:32:00,1,125,51,1,0
2022-11-01 06:40:00,1,93,87,1,0
2022-11-01 06:48:00,1,98,58,1,0
2022-11-01 06:56:00,1,96,70,1,0
2022-11-01 07:04:00,1,99,56,1,0
2022-11-01 07:12:00,1,102,76,1,0
2022-11-01 07:20:00,1,124,70,1,0
2022-11-01 07:28:00,1,111,89,1,0
2022-11-01 07:36:00,1,99,69,1,0
2022-11-01 07:44:00,1,114,77,1,0
2022-11-01 07:52:00,1,134,62,1,0
2022-11-01 08:00:00,1,131,62,1,0
2022-11-01 08:08:00,1,128,83,1,0
2022-11-01 08:16:00,1,129,90,1,0
2022-11-01 08:24:00,1,95,83,1,0
2022-11-01 08:32:00,1,118,64,1,0
2022-11-01 08:40:00,1,101,51,1,0
2022-11-01 08:48:00,1,121,69,1,0
2022-11-01 08:56:00,1,90,61,1,0
2022-11-01 09:04:00,1,120,61,1,0
2022-11-01 09:12:00,1,94,80,1,0
2022-11-01 09:20:00,1,105,72,1,0
2022-11-01 09:28:00,1,117,51,1,0
2022-11-01 09:36:00,1,101,70,1,0
2022-11-01 09:44:00,1,117,50,1,0
2022-11-01 09:52:00,1,132,73,1,0
2022-11-01 10:00:00,1,115,76,1,0
2022-11-01 10:08:00,1,135,79,1,0
2022-11-01 10:16:00,1,95,87,1,0
2022-11-01 10:24:00,1,121,82,1,0
2022-11-01 10:32:00,1,123,76,1,0
2022-11-01 10:40:00,1,98,66,1,0
2022-11-01 10:48:00,1,135,87,1,0
2022-11-01 10:56:00,1,109,87,1,0
2022-11-01 11:04:00,1,115,61,1,0
2022-11-01 11:12:00,1,125,54,1,0
2022-11-01 11:20:00,1,98,72,1,0
2022-11-01 11:28:00,1,105,64,1,0
2022-11-01 11:36:00,1,131,83,1,0
2022-11-01 11:44:00,1,107,51,1,0
2022-11-01 11:52:00,1,122,69,1,0
2022-11-01 12:00:00,1,123,82,1,0
2022-11-01 12:08:00,1,92,68,1,0
2022-11-01 12:16:00,1,124,72,1,0
2022-11-01 12:24:00,1,112,84,1,0
2022-11-01 12:32:00,1,118,90,1,0
2022-11-01 12:40:00,1,135,64,1,0
2022-11-01 12:48:00,1,105,80,1,0
2022-11-01 12:56:00,1,130,69,1,0
2022-11-01 13:04:00,1,92,88,1,0
2022-11-01 13:12:00,1,115,84,1,0
2022-11-01 13:20:00,1,125,75,1,0
2022-11-01 13:28:00,1,108,79,1,0
2022-11-01 13:36:00,1,113,90,1,0
2022-11-01 13:44:00,1,93,70,1,0
2022-11-01 13:52:00,1,98,79,1,0
2022-11-01 14:00:00,1,124,90,1,0
2022-11-01 14:08:00,1,106,58,1,0
2022-11-01 14:16:00,1,131,77,1,0
2022-11-01 14:24:00,1,97,81,1,0
2022-11-01 14:32:00,1,103,75,1,0
2022-11-01 14:40:00,1,111,57,1,0
2022-11-01 14:48:00,1,129,89,1,0
2022-11-01 14:56:00,1,117,79,1,0
2022-11-01 15:04:00,1,126,85,1,0
2022-11-01 15:12:00,1,129,82,1,0
2022-11-01 15:20:00,1,118,85,1,0
2022-11-01 15:28:00,1,101,52,1,0
2022-11-01 15:36:00,1,107,65,1,0
2022-11-01 15:44:00,1,121,89,1,0
2022-11-01 15:52:00,1,103,50,1,0
2022-11-01 16:00:00,1,110,80,1,0
2022-11-01 16:08:00,1,105,58,1,0
2022-11-01 16:16:00,1,130,51,1,0
2022-11-01 16:24:00,1,97,57,1,0
2022-11-01 16:32:00,1,134,88,1,0
2022-11-01 16:40:00,1,102,71,1,0
2022-11-01 16:48:00,1,115,58,1,0
2022-11-01 16:56:00,1,101,63,1,0
2022-11-01 17:04:00,1,134,76,1,0
2022-11-01 17:12:00,1,128,64,1,0
2022-11-01 17:20:00,1,108,70,1,0
2022-11-01 17:28:00,1,126,67,1,0
2022-11-01 17:36:00,1,97,80,1,0
2022-11-01 17:44:00,1,128,51,1,0
2022-11-01 17:52:00,1,104,83,1,0
2022-11-01 18:00:00,1,106,79,1,0
2022-11-01 18:08:00,1,135,82,1,0
2022-11-01 18:16:00,1,104,90,1,0
2022-11-01 18:24:00,1,125,85,1,0
2022-11-01 18:32:00,1,109,57,1,0
2022-11-01 18:40:00,1,106,78,1,0
2022-11-01 18:48:00,1,102,70,1,0
2022-11-01 18:56:00,1,118,76,1,0
2022-11-01 19:04:00,1,117,86,1,0
2022-11-01 19:12:00,1,114,79,1,0
2022-11-01 19:20:00,1,98,67,1,0
2022-11-01 19:28:00,1,118,77,1,0
2022-11-01 19:36:00,1,121,57,1,0
2022-11-01 19:44:00,1,132,77,1,0
2022-11-01 19:52:00,1,102,80,1,0
2022-11-01 20:00:00,1,100,78,1,0
2022-11-01 20:08:00,1,100,71,1,0
2022-11-01 20:16:00,1,90,60,1,0
2022-11-01 20:24:00,1,135,83,1,0
2022-11-01 20:32:00,1,114,52,1,0
2022-11-01 20:40:00,1,124,57,1,0
2022-11-01 20:48:00,1,124,71,1,0
2022-11-01 20:56:00,1,116,76,1,0
2022-11-01 21:04:00,1,99,60,1,0
2022-11-01 21:12:00,1,126,75,1,0
2022-11-01 21:20:00,1,90,78,1,0
2022-11-01 21:28:00,1,120,68,1,0
2022-11-01 21:36:00,1,122,65,1,0
2022-11-01 21:44:00,1,115,87,1,0
2022-11-01 21:52:00,1,109,75,1,0
2022-11-01 22:00:00,1,129,85,1,0
2022-11-01 22:08:00,1,134,82,1,0
2022-11-01 22:16:00,1,121,57,1,0
2022-11-01 22:24:00,1,118,73,1,0
2022-11-01 22:32:00,1,123,59,1,0
2022-11-01 22:40:00,1,130,82,1,0
2022-11-01 22:48:00,1,103,85,1,0
2022-11-01 22:56:00,1,133,56,1,0
2022-11-01 23:04:00,1,91,50,1,0
2022-11-01 23:12:00,1,97,77,1,0
2022-11-01 23:20:00,1,106,65,1,0
2022-11-01 23:28:00,1,113,83,1,0
2022-11-01 23:36:00,1,133,85,1,0
2022-11-01 23:44:00,1,92,81,1,0
2022-11-01 23:52:00,1,104,70,1,0
2022-11-01 02:00:00,1,100,72,1,1
2022-11-01 02:09:00,1,109,61,1,1
2022-11-01 02:18:00,1,113,75,1,1
2022-11-01 02:27:00,1,105,77,1,1
2022-11-01 02:36:00,1,100,68,1,1
2022-11-01 02:45:00,1,110,76,1,1
2022-11-01 02:54:00,1,120,66,1,1
2022-11-01 03:03:00,1,112,69,1,1
2022-11-01 03:12:00,1,118,77,1,1
2022-11-01 03:21:00,1,112,70,1,1
2022-11-01 03:30:00,1,115,60,1,1
2022-11-01 03:39:00,1,115,72,1,1
2022-11-01 03:48:00,1,119,67,1,1
2022-11-01 03:57:00,1,102,60,1,1
2022-11-01 04:06:00,1,114,70,1,1
2022-11-01 04:15:00,1,115,68,1,1
2022-11-01 04:24:00,1,116,65,1,1
2022-11-01 04:33:00,1,108,67,1,1
2022-11-01 04:42:00,1,100,63,1,1
2022-11-01 04:51:00,1,107,64,1,1
2022-11-01 05:00:00,1,108,66,1,1
2022-11-01 05:09:00,1,120,72,1,1
2022-11-01 05:18:00,1,104,66,1,1
2022-11-01 05:27:00,1,109,70,1,1
2022-11-01 05:36:00,1,117,66,1,1
2022-11-01 05:45:00,1,109,66,1,1
2022-11-01 05:54:00,1,101,68,1,1
2022-11-01 06:03:00,1,108,77,1,1
2022-11-01 06:12:00,1,103,75,1,1
2022-11-01 06:21:00,1,105,74,1,1
2022-11-01 06:30:00,1,103,69,1,1
2022-11-01 06:39:00,1,106,70,1,1
2022-11-01 06:48:00,1,110,68,1,1
2022-11-01 06:57:00,1,115,77,1,1
2022-11-01 07:06:00,1,118,72,1,1
2022-11-01 07:15:00,1,100,61,1,1
2022-11-01 07:24:00,1,104,73,1,1
2022-11-01 07:33:00,1,108,62,1,1
2022-11-01 07:42:00,1,120,60,1,1
2022-11-01 07:51:00,1,115,75,1,1
2022-11-01 08:00:00,1,105,76,1,1
2022-11-01 08:09:00,1,113,71,1,1
2022-11-01 08:18:00,1,108,67,1,1
2022-11-01 08:27:00,1,112,71,1,1
2022-11-01 08:36:00,1,104,76,1,1
2022-11-01 08:45:00,1,109,80,1,1
2022-11-01 08:54:00,1,117,70,1,1
2022-11-01 09:03:00,1,120,62,1,1
2022-11-01 09:12:00,1,114,75,1,1
2022-11-01 09:21:00,1,102,60,1,1
2022-11-01 09:30:00,1,101,67,1,1
2022-11-01 09:39:00,1,113,65,1,1
2022-11-01 09:48:00,1,119,68,1,1
2022-11-01 09:57:00,1,101,60,1,1
2022-11-01 10:06:00,1,102,77,1,1
2022-11-01 10:15:00,1,103,70,1,1
2022-11-01 10:24:00,1,115,70,1,1
2022-11-01 10:33:00,1,105,72,1,1
2022-11-01 10:42:00,1,101,64,1,1
2022-11-01 10:51:00,1,111,78,1,1
2022-11-01 11:00:00,1,118,66,1,1
2022-11-01 11:09:00,1,101,64,1,1
2022-11-01 11:18:00,1,117,61,1,1
2022-11-01 11:27:00,1,116,74,1,1
2022-11-01 11:36:00,1,103,76,1,1
2022-11-01 11:45:00,1,120,69,1,1
2022-11-01 11:54:00,1,120,74,1,1
2022-11-01 12:03:00,1,105,75,1,1
2022-11-01 12:12:00,1,106,66,1,1
2022-11-01 12:21:00,1,102,63,1,1
2022-11-01 12:30:00,1,104,77,1,1
2022-11-01 12:39:00,1,103,62,1,1
2022-11-01 12:48:00,1,102,68,1,1
2022-11-01 12:57:00,1,116,64,1,1
2022-11-01 13:06:00,1,118,79,1,1
2022-11-01 13:15:00,1,105,67,1,1
2022-11-01 13:24:00,1,102,73,1,1
2022-11-01 13:33:00,1,110,70,1,1
2022-11-01 13:42:00,1,114,61,1,1
2022-11-01 13:51:00,1,108,70,1,1
2022-11-01 14:00:00,1,107,79,1,1
2022-11-01 14:09:00,1,118,61,1,1
2022-11-01 14:18:00,1,118,73,1,1
2022-11-01 14:27:00,1,100,74,1,1
2022-11-01 14:36:00,1,112,71,1,1
2022-11-01 14:45:00,1,113,63,1,1
2022-11-01 14:54:00,1,106,78,1,1
2022-11-01 15:03:00,1,105,66,1,1
2022-11-01 15:12:00,1,118,69,1,1
2022-11-01 15:21:00,1,118,69,1,1
2022-11-01 15:30:00,1,100,67,1,1
2022-11-01 15:39:00,1,113,70,1,1
2022-11-01 15:48:00,1,101,74,1,1
2022-11-01 15:57:00,1,108,78,1,1
2022-11-01 16:06:00,1,112,71,1,1
2022-11-01 16:15:00,1,111,71,1,1
2022-11-01 16:24:00,1,118,65,1,1
2022-11-01 16:33:00,1,103,65,1,1
2022-11-01 16:42:00,1,104,65,1,1
2022-11-01 16:51:00,1,100,61,1,1
2022-11-01 17:00:00,1,100,60,1,1
2022-11-01 17:09:00,1,110,65,1,1
2022-11-01 17:18:00,1,107,68,1,1
2022-11-01 17:27:00,1,102,78,1,1
2022-11-01 17:36:00,1,106,76,1,1
2022-11-01 17:45:00,1,100,76,1,1
2022-11-01 17:54:00,1,104,78,1,1
2022-11-01 18:03:00,1,116,62,1,1
2022-11-01 18:12:00,1,104,62,1,1
2022-11-01 18:21:00,1,113,76,1,1
2022-11-01 18:30:00,1,103,73,1,1
2022-11-01 18:39:00,1,116,80,1,1
2022-11-01 18:48:00,1,104,61,1,1
2022-11-01 18:57:00,1,109,66,1,1
2022-11-01 19:06:00,1,104,62,1,1
2022-11-01 19:15:00,1,111,74,1,1
2022-11-01 19:24:00,1,109,63,1,1
2022-11-01 19:33:00,1,115,78,1,1
2022-11-01 19:42:00,1,114,61,1,1
2022-11-01 19:51:00,1,120,71,1,1
2022-11-01 20:00:00,1,111,78,1,1
2022-11-01 20:09:00,1,107,69,1,1
2022-11-01 20:18:00,1,113,80,1,1
2022-11-01 20:27:00,1,106,61,1,1
2022-11-01 20:36:00,1,115,77,1,1
2022-11-01 20:45:00,1,100,66,1,1
2022-11-01 20:54:00,1,115,63,1,1
2022-11-01 21:03:00,1,115,72,1,1
2022-11-01 21:12:00,1,101,61,1,1
2022-11-01 21:21:00,1,109,65,1,1
2022-11-01 21:30:00,1,103,79,1,1
2022-11-01 21:39:00,1,118,61,1,1
2022-11-01 21:48:00,1,113,77,1,1
2022-11-01 21:57:00,1,105,62,1,1
2022-11-01 22:06:00,1,103,79,1,1
2022-11-01 22:15:00,1,106,67,1,1
2022-11-01 22:24:00,1,111,68,1,1
2022-11-01 22:33:00,1,116,66,1,1
2022-11-01 22:42:00,1,109,66,1,1
2022-11-01 22:51:00,1,111,60,1,1
2022-11-01 23:00:00,1,106,80,1,1
2022-11-01 23:09:00,1,103,71,1,1
2022-11-01 23:18:00,1,118,72,1,1
2022-11-01 23:27:00,1,107,60,1,1
2022-11-01 23:36:00,1,106,68,1,1
2022-11-01 23:45:00,1,112,69,1,1
2022-11-01 23:54:00,1,105,76,1,1
