Retime

The retime function allows you to retime, i.e. change the timestamps of a TimeArray, similar to what Matlab's retime does.

using Plots, Dates, TimeSeries
gr()
timestamps = range(DateTime(2020, 1, 1), length = 7*24, step = Hour(1))
ta = TimeArray(timestamps, cumsum(randn(7*24)), [:a])
168×1 TimeArray{Float64, 1, DateTime, Vector{Float64}} 2020-01-01T00:00:00 to 2020-01-07T23:00:00
┌─────────────────────┬───────────┐
│                     │ a         │
├─────────────────────┼───────────┤
│ 2020-01-01T00:00:00 │   1.27357 │
│ 2020-01-01T01:00:00 │  0.753239 │
│ 2020-01-01T02:00:00 │  0.316503 │
│ 2020-01-01T03:00:00 │ -0.723794 │
│ 2020-01-01T04:00:00 │ -0.406855 │
│ 2020-01-01T05:00:00 │  -1.77644 │
│ 2020-01-01T06:00:00 │  -2.19639 │
│ 2020-01-01T07:00:00 │  -1.51533 │
│          ⋮          │     ⋮     │
│ 2020-01-07T17:00:00 │  -8.21812 │
│ 2020-01-07T18:00:00 │  -7.63241 │
│ 2020-01-07T19:00:00 │  -9.13736 │
│ 2020-01-07T20:00:00 │  -7.84562 │
│ 2020-01-07T21:00:00 │  -5.96258 │
│ 2020-01-07T22:00:00 │  -5.24285 │
│ 2020-01-07T23:00:00 │  -4.68987 │
└─────────────────────┴───────────┘
                   153 rows omitted

Using a new time step

retime(ta, Minute(15))
669×1 TimeArray{Float64, 2, DateTime, Matrix{Float64}} 2020-01-01T00:00:00 to 2020-01-07T23:00:00
┌─────────────────────┬──────────┐
│                     │ a        │
├─────────────────────┼──────────┤
│ 2020-01-01T00:00:00 │  1.27357 │
│ 2020-01-01T00:15:00 │  1.27357 │
│ 2020-01-01T00:30:00 │  1.27357 │
│ 2020-01-01T00:45:00 │  1.27357 │
│ 2020-01-01T01:00:00 │ 0.753239 │
│ 2020-01-01T01:15:00 │ 0.753239 │
│ 2020-01-01T01:30:00 │ 0.753239 │
│ 2020-01-01T01:45:00 │ 0.753239 │
│          ⋮          │    ⋮     │
│ 2020-01-07T21:30:00 │ -5.96258 │
│ 2020-01-07T21:45:00 │ -5.96258 │
│ 2020-01-07T22:00:00 │ -5.24285 │
│ 2020-01-07T22:15:00 │ -5.24285 │
│ 2020-01-07T22:30:00 │ -5.24285 │
│ 2020-01-07T22:45:00 │ -5.24285 │
│ 2020-01-07T23:00:00 │ -4.68987 │
└─────────────────────┴──────────┘
                  654 rows omitted

Using new timestep vector

new_timestamps = range(DateTime(2020, 1, 1), DateTime(2020, 1, 2), step = Minute(15))
retime(ta, new_timestamps)
97×1 TimeArray{Float64, 2, DateTime, Matrix{Float64}} 2020-01-01T00:00:00 to 2020-01-02T00:00:00
┌─────────────────────┬──────────┐
│                     │ a        │
├─────────────────────┼──────────┤
│ 2020-01-01T00:00:00 │  1.27357 │
│ 2020-01-01T00:15:00 │  1.27357 │
│ 2020-01-01T00:30:00 │  1.27357 │
│ 2020-01-01T00:45:00 │  1.27357 │
│ 2020-01-01T01:00:00 │ 0.753239 │
│ 2020-01-01T01:15:00 │ 0.753239 │
│ 2020-01-01T01:30:00 │ 0.753239 │
│ 2020-01-01T01:45:00 │ 0.753239 │
│          ⋮          │    ⋮     │
│ 2020-01-01T22:30:00 │ -8.78642 │
│ 2020-01-01T22:45:00 │ -8.78642 │
│ 2020-01-01T23:00:00 │ -7.37933 │
│ 2020-01-01T23:15:00 │ -7.37933 │
│ 2020-01-01T23:30:00 │ -7.37933 │
│ 2020-01-01T23:45:00 │ -7.37933 │
│ 2020-01-02T00:00:00 │ -6.96868 │
└─────────────────────┴──────────┘
                   82 rows omitted

Irregular timestamps

You can perform retime on irregularly spaced timestamps, both using a TimeArray with irregular timestamps or using a vector of irregular timestamps. Depending on the timestamps upsampling or downsampling is used.

new_timestamps = vcat(
    range(DateTime(2020, 1, 1), DateTime(2020, 1, 2)-Minute(15), step = Minute(15)),
    range(DateTime(2020, 1, 2), DateTime(2020, 1, 3), step = Hour(1)),
)
retime(ta, new_timestamps)
121×1 TimeArray{Float64, 2, DateTime, Matrix{Float64}} 2020-01-01T00:00:00 to 2020-01-03T00:00:00
┌─────────────────────┬──────────┐
│                     │ a        │
├─────────────────────┼──────────┤
│ 2020-01-01T00:00:00 │  1.27357 │
│ 2020-01-01T00:15:00 │  1.27357 │
│ 2020-01-01T00:30:00 │  1.27357 │
│ 2020-01-01T00:45:00 │  1.27357 │
│ 2020-01-01T01:00:00 │ 0.753239 │
│ 2020-01-01T01:15:00 │ 0.753239 │
│ 2020-01-01T01:30:00 │ 0.753239 │
│ 2020-01-01T01:45:00 │ 0.753239 │
│          ⋮          │    ⋮     │
│ 2020-01-02T18:00:00 │ -5.10104 │
│ 2020-01-02T19:00:00 │ -4.85818 │
│ 2020-01-02T20:00:00 │ -4.82911 │
│ 2020-01-02T21:00:00 │ -5.34681 │
│ 2020-01-02T22:00:00 │  -5.7862 │
│ 2020-01-02T23:00:00 │ -6.14265 │
│ 2020-01-03T00:00:00 │  -4.8716 │
└─────────────────────┴──────────┘
                  106 rows omitted

Upsampling

Interpolation is done using the upsample argument. If no data is directly hit, the specified upsample method is used. Available upsample methods are:

  • Linear() or :linear
  • Nearest() or :nearest
  • Previous() or :previous
  • Next() or :next
ta_ = retime(ta, Minute(15), upsample=Linear())
669×1 TimeArray{Float64, 2, DateTime, Matrix{Float64}} 2020-01-01T00:00:00 to 2020-01-07T23:00:00
┌─────────────────────┬──────────┐
│                     │ a        │
├─────────────────────┼──────────┤
│ 2020-01-01T00:00:00 │  1.27357 │
│ 2020-01-01T00:15:00 │  1.14349 │
│ 2020-01-01T00:30:00 │   1.0134 │
│ 2020-01-01T00:45:00 │ 0.883321 │
│ 2020-01-01T01:00:00 │ 0.753239 │
│ 2020-01-01T01:15:00 │ 0.644055 │
│ 2020-01-01T01:30:00 │ 0.534871 │
│ 2020-01-01T01:45:00 │ 0.425687 │
│          ⋮          │    ⋮     │
│ 2020-01-07T21:30:00 │ -5.60271 │
│ 2020-01-07T21:45:00 │ -5.42278 │
│ 2020-01-07T22:00:00 │ -5.24285 │
│ 2020-01-07T22:15:00 │  -5.1046 │
│ 2020-01-07T22:30:00 │ -4.96636 │
│ 2020-01-07T22:45:00 │ -4.82811 │
│ 2020-01-07T23:00:00 │ -4.68987 │
└─────────────────────┴──────────┘
                  654 rows omitted
plot(ta)
plot!(ta_)

Downsampling

Downsampling or aggregation is done using the downsample argument. This applies a function to each interval not including the right-edge of the interval. If no data is present in the interval the specified upsample method is used. Available downsample methods are:

  • Mean() or :mean
  • Min() or :min
  • Max() or :max
  • Count() or :count
  • Sum() or :sum
  • Median() or :median
  • First() or :first
  • Last() or :last
ta_ = retime(ta, Hour(6), downsample=Mean())
28×1 TimeArray{Float64, 2, DateTime, Matrix{Float64}} 2020-01-01T00:00:00 to 2020-01-07T18:00:00
┌─────────────────────┬────────────┐
│                     │ a          │
├─────────────────────┼────────────┤
│ 2020-01-01T00:00:00 │ -0.0939625 │
│ 2020-01-01T06:00:00 │   -2.97389 │
│ 2020-01-01T12:00:00 │   -4.48461 │
│ 2020-01-01T18:00:00 │   -6.89188 │
│ 2020-01-02T00:00:00 │   -8.42634 │
│ 2020-01-02T06:00:00 │   -10.4126 │
│ 2020-01-02T12:00:00 │   -7.51627 │
│ 2020-01-02T18:00:00 │     -5.344 │
│          ⋮          │     ⋮      │
│ 2020-01-06T06:00:00 │   -7.11707 │
│ 2020-01-06T12:00:00 │    -6.9135 │
│ 2020-01-06T18:00:00 │   -6.35822 │
│ 2020-01-07T00:00:00 │    -4.9522 │
│ 2020-01-07T06:00:00 │   -8.03411 │
│ 2020-01-07T12:00:00 │    -8.8537 │
│ 2020-01-07T18:00:00 │   -6.75178 │
└─────────────────────┴────────────┘
                     13 rows omitted
plot(ta)
plot!(ta_)

Extrapolation

Extrapolation at the beginning and end of the time series is done using the extrapolate argument. Available extrapolate methods are:

  • FillConstant(value) or :fillconstant
  • NearestExtrapolate() or :nearest
  • MissingExtrapolate() or :missing
  • NaNExtrapolate() or :nan
new_timestamps = range(DateTime(2019, 12, 31), DateTime(2020, 1, 2), step = Minute(15))
ta_ = retime(ta, new_timestamps, extrapolate=MissingExtrapolate())
193×1 TimeArray{Union{Missing, Float64}, 2, DateTime, Matrix{Union{Missing, Float64}}} 2019-12-31T00:00:00 to 2020-01-02T00:00:00
┌─────────────────────┬──────────┐
│                     │ a        │
├─────────────────────┼──────────┤
│ 2019-12-31T00:00:00 │  missing │
│ 2019-12-31T00:15:00 │  missing │
│ 2019-12-31T00:30:00 │  missing │
│ 2019-12-31T00:45:00 │  missing │
│ 2019-12-31T01:00:00 │  missing │
│ 2019-12-31T01:15:00 │  missing │
│ 2019-12-31T01:30:00 │  missing │
│ 2019-12-31T01:45:00 │  missing │
│          ⋮          │    ⋮     │
│ 2020-01-01T22:30:00 │ -8.78642 │
│ 2020-01-01T22:45:00 │ -8.78642 │
│ 2020-01-01T23:00:00 │ -7.37933 │
│ 2020-01-01T23:15:00 │ -7.37933 │
│ 2020-01-01T23:30:00 │ -7.37933 │
│ 2020-01-01T23:45:00 │ -7.37933 │
│ 2020-01-02T00:00:00 │ -6.96868 │
└─────────────────────┴──────────┘
                  178 rows omitted

Interpolation Methods

Available interpolation methods: Linear, Previous, Next, Nearest.

Aggregation Methods

Available aggregation methods: Mean, Min, Max, Count, Sum, Median, First, Last.

Extrapolation Methods

Available extrapolation methods: FillConstant, NearestExtrapolate, MissingExtrapolate, NaNExtrapolate.