Resample and Aggregate Sensor Data — Any Interval, Minima and Maxima Kept
Drop in a logger export. The file is read where it sits, the sampling interval and the gaps are worked out for you, and you get the series aggregated to whatever interval you asked for — with a band showing the highest and lowest reading inside each bucket, so you can see what the averaging hid rather than trusting that it hid nothing.
Your data
Drop a logger CSV here
HOBOware and Postlad exports are recognised automatically. It is read on this machine — nothing is uploaded.
Synthetic three-day greenhouse record at five-minute intervals, written in the Onset HOBOware export layout and declaring GMT-04:00. It contains a deliberate four-hour outage on the second afternoon, so the gap handling is visible. Not measured data.
SVG is vector — scale it to any size in Illustrator, Inkscape or LaTeX without losing quality, and edit the type. Use it unless a journal insists on raster.
Options
Series
Which measurement to aggregate.
Bucket width. Buckets are half-open — a reading exactly on a boundary belongs to the bucket that starts there.
Sum is only meaningful for a quantity that accumulates — rainfall, not temperature.
The middle is where an average belongs. The start is what a database GROUP BY gives you.
A bucket with fewer than this is left empty. Raise it to stop a partial hour being reported as a full one.
Figure
All of that was worked out in this browser tab. Your file was not uploaded, and no request goes out while you work — open the network panel and watch, if you like.
What resampling actually costs you
Averaging a one-minute series to hourly throws away fifty-nine readings out of every sixty and keeps a number that is genuinely useful — and genuinely silent about what it replaced. An hourly mean of solar radiation says nothing about the 1,100 W/m² peak inside the hour. An hourly mean of a leaf-wetness sensor turns two separate wet periods into one damp one, which is the difference between a disease model firing and not firing.
That is why the figure on this page draws a shaded band as well as a line. The band is the highest and lowest reading inside each bucket. Where it is narrow, the average is a fair summary; where it balloons, the average is hiding something and you can see exactly where. The note under the figure gives the single largest difference between any one reading and the value plotted for its bucket, in your own units.
Buckets, boundaries and the half-hour offset nobody notices
Buckets here are half-open: a reading exactly on a boundary belongs to the bucket that starts there. That is the same convention a database GROUP BY uses, and it means two files resampled separately and then concatenated have no duplicated and no missing reading on the seam.
Where the aggregated point is DRAWN is a separate question and the default here is the middle of the bucket, not its start. An hourly mean describes the whole hour, and plotting it at the hour’s start places it half an hour before the data it summarises. On a chart that is invisible; in a cross-correlation against another series it is a systematic half-interval lead that will be read as a real lag. You can switch to the start if you are reconciling against a query that does it that way.
Gaps are not zeroes
A bucket with no readings in it comes out empty, and the line breaks. It does not come out as zero. A logger that was flat for three weeks and a logger that was unplugged for three weeks produce very different data and identical monthly averages, and a chart that draws a straight line across the outage makes the second look like the first.
The shaded vertical bands mark gaps in the underlying record — spacings longer than the file’s own sampling interval — so you can see where the instrument stopped as distinct from where a bucket happened to be short.
Time zones
A HOBOware export states its offset in the date column header, and that offset is used. A file that states nothing is read as UTC — never as your computer’s local time, because that would mean the same file analysed in two cities produced two different answers, and a saved analysis changed meaning when its author travelled.
The offset in force is printed on the figure. If your logger was on local time and the file did not say so, set the offset before comparing the series with anything else.
Common questions
- Does it upload my file?
- No. The file is read by the browser and parsed by code running in the tab. Open the Network panel in your developer tools and load a file — you will see no request. You can also disconnect from the network entirely and keep working.
- Which logger formats does it read?
- Onset HOBOware exports and Postlad stream exports are detected automatically, including the HOBOware variants with no plot title, no row-number column, no quoting, tab or semicolon separators, and a split Date and Time column. Anything else is read as ordinary delimited text, which covers most hand-rolled logger CSVs — the timestamp column is found by trying to parse it rather than by trusting its header.
- Can I aggregate to an interval shorter than my data?
- You can, and the result is mostly empty buckets, which is what it should be. Nothing is interpolated. Filling in readings that were never taken is a modelling decision, not an aggregation one, and this tool will not make it silently on your behalf.
- What happens to non-detects?
- A value written as "<0.5", or as a number carrying a U qualifier, is carried as a censored value rather than parsed as text and dropped. In this tool it is aggregated at the reported limit and counted, and the note under the figure says how many there were. Choosing a substitution method is a statistical decision and belongs to the trend tools, not to a resampler.
- Is the sample data real?
- No. It is generated by the page — a synthetic three-day greenhouse record with a deliberate four-hour outage in it, written in the HOBOware export layout so the format detection is visible. Nothing on this site presents invented data as measurements.