java 21 lines · 5 steps

Backfilling gaps in a daily time series in Java

Turn a sparse list of dated samples into a continuous day-by-day series by synthesizing entries for every missing date.

Explained by highlit
1public List<DailySample> backfillMissingDates(List<DailySample> samples, double fillValue) {
2 if (samples.isEmpty()) {
3 return List.of();
4 }
5 
6 Map<LocalDate, DailySample> byDate = samples.stream()
7 .collect(Collectors.toMap(
8 DailySample::date,
9 Function.identity(),
10 (a, b) -> b,
11 TreeMap::new));
12 
13 LocalDate start = ((TreeMap<LocalDate, DailySample>) byDate).firstKey();
14 LocalDate end = ((TreeMap<LocalDate, DailySample>) byDate).lastKey();
15 
16 return start.datesUntil(end.plusDays(1))
17 .map(date -> byDate.getOrDefault(date, new DailySample(date, fillValue)))
18 .collect(Collectors.toList());
19}
20 
21record DailySample(LocalDate date, double value) {}
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1A sorted map lets you derive the full date range and do O(1) lookups in one structure.
  2. 2datesUntil generates a continuous sequence so you can materialize entries that never existed in the input.
  3. 3Guarding the empty case up front keeps later range calculations from throwing on missing keys.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Backfilling gaps in a daily time series in Java — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code