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.54814 │
│ 2020-01-01T01:00:00 │ 2.69663 │
│ 2020-01-01T02:00:00 │ 3.77173 │
│ 2020-01-01T03:00:00 │ 3.73929 │
│ 2020-01-01T04:00:00 │ 4.89833 │
│ 2020-01-01T05:00:00 │ 4.01717 │
│ 2020-01-01T06:00:00 │ 4.61233 │
│ 2020-01-01T07:00:00 │ 3.54755 │
│ ⋮ │ ⋮ │
│ 2020-01-07T17:00:00 │ 7.45827 │
│ 2020-01-07T18:00:00 │ 7.926 │
│ 2020-01-07T19:00:00 │ 6.91334 │
│ 2020-01-07T20:00:00 │ 6.57742 │
│ 2020-01-07T21:00:00 │ 6.4432 │
│ 2020-01-07T22:00:00 │ 6.51921 │
│ 2020-01-07T23:00:00 │ 5.98638 │
└─────────────────────┴─────────┘
153 rows omittedUsing 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.54814 │
│ 2020-01-01T00:15:00 │ 1.54814 │
│ 2020-01-01T00:30:00 │ 1.54814 │
│ 2020-01-01T00:45:00 │ 1.54814 │
│ 2020-01-01T01:00:00 │ 2.69663 │
│ 2020-01-01T01:15:00 │ 2.69663 │
│ 2020-01-01T01:30:00 │ 2.69663 │
│ 2020-01-01T01:45:00 │ 2.69663 │
│ ⋮ │ ⋮ │
│ 2020-01-07T21:30:00 │ 6.4432 │
│ 2020-01-07T21:45:00 │ 6.4432 │
│ 2020-01-07T22:00:00 │ 6.51921 │
│ 2020-01-07T22:15:00 │ 6.51921 │
│ 2020-01-07T22:30:00 │ 6.51921 │
│ 2020-01-07T22:45:00 │ 6.51921 │
│ 2020-01-07T23:00:00 │ 5.98638 │
└─────────────────────┴─────────┘
654 rows omittedUsing 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.54814 │
│ 2020-01-01T00:15:00 │ 1.54814 │
│ 2020-01-01T00:30:00 │ 1.54814 │
│ 2020-01-01T00:45:00 │ 1.54814 │
│ 2020-01-01T01:00:00 │ 2.69663 │
│ 2020-01-01T01:15:00 │ 2.69663 │
│ 2020-01-01T01:30:00 │ 2.69663 │
│ 2020-01-01T01:45:00 │ 2.69663 │
│ ⋮ │ ⋮ │
│ 2020-01-01T22:30:00 │ 1.94054 │
│ 2020-01-01T22:45:00 │ 1.94054 │
│ 2020-01-01T23:00:00 │ 1.83243 │
│ 2020-01-01T23:15:00 │ 1.83243 │
│ 2020-01-01T23:30:00 │ 1.83243 │
│ 2020-01-01T23:45:00 │ 1.83243 │
│ 2020-01-02T00:00:00 │ 1.77138 │
└─────────────────────┴─────────┘
82 rows omittedIrregular 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.54814 │
│ 2020-01-01T00:15:00 │ 1.54814 │
│ 2020-01-01T00:30:00 │ 1.54814 │
│ 2020-01-01T00:45:00 │ 1.54814 │
│ 2020-01-01T01:00:00 │ 2.69663 │
│ 2020-01-01T01:15:00 │ 2.69663 │
│ 2020-01-01T01:30:00 │ 2.69663 │
│ 2020-01-01T01:45:00 │ 2.69663 │
│ ⋮ │ ⋮ │
│ 2020-01-02T18:00:00 │ 2.94742 │
│ 2020-01-02T19:00:00 │ 3.77958 │
│ 2020-01-02T20:00:00 │ 4.10768 │
│ 2020-01-02T21:00:00 │ 2.08355 │
│ 2020-01-02T22:00:00 │ 1.61006 │
│ 2020-01-02T23:00:00 │ 2.41294 │
│ 2020-01-03T00:00:00 │ 2.06605 │
└─────────────────────┴─────────┘
106 rows omittedUpsampling
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:linearNearest()or:nearestPrevious()or:previousNext()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.54814 │
│ 2020-01-01T00:15:00 │ 1.83526 │
│ 2020-01-01T00:30:00 │ 2.12238 │
│ 2020-01-01T00:45:00 │ 2.40951 │
│ 2020-01-01T01:00:00 │ 2.69663 │
│ 2020-01-01T01:15:00 │ 2.9654 │
│ 2020-01-01T01:30:00 │ 3.23418 │
│ 2020-01-01T01:45:00 │ 3.50295 │
│ ⋮ │ ⋮ │
│ 2020-01-07T21:30:00 │ 6.4812 │
│ 2020-01-07T21:45:00 │ 6.50021 │
│ 2020-01-07T22:00:00 │ 6.51921 │
│ 2020-01-07T22:15:00 │ 6.38601 │
│ 2020-01-07T22:30:00 │ 6.2528 │
│ 2020-01-07T22:45:00 │ 6.11959 │
│ 2020-01-07T23:00:00 │ 5.98638 │
└─────────────────────┴─────────┘
654 rows omittedplot(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:meanMin()or:minMax()or:maxCount()or:countSum()or:sumMedian()or:medianFirst()or:firstLast()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 │ 3.44521 │
│ 2020-01-01T06:00:00 │ 3.37861 │
│ 2020-01-01T12:00:00 │ 1.57452 │
│ 2020-01-01T18:00:00 │ 2.32008 │
│ 2020-01-02T00:00:00 │ 1.28296 │
│ 2020-01-02T06:00:00 │ -0.218165 │
│ 2020-01-02T12:00:00 │ 0.483424 │
│ 2020-01-02T18:00:00 │ 2.82354 │
│ ⋮ │ ⋮ │
│ 2020-01-06T06:00:00 │ 6.55386 │
│ 2020-01-06T12:00:00 │ 9.54954 │
│ 2020-01-06T18:00:00 │ 9.42196 │
│ 2020-01-07T00:00:00 │ 9.68123 │
│ 2020-01-07T06:00:00 │ 10.6387 │
│ 2020-01-07T12:00:00 │ 8.47539 │
│ 2020-01-07T18:00:00 │ 6.72759 │
└─────────────────────┴───────────┘
13 rows omittedplot(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:fillconstantNearestExtrapolate()or:nearestMissingExtrapolate()or:missingNaNExtrapolate()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 │ 1.94054 │
│ 2020-01-01T22:45:00 │ 1.94054 │
│ 2020-01-01T23:00:00 │ 1.83243 │
│ 2020-01-01T23:15:00 │ 1.83243 │
│ 2020-01-01T23:30:00 │ 1.83243 │
│ 2020-01-01T23:45:00 │ 1.83243 │
│ 2020-01-02T00:00:00 │ 1.77138 │
└─────────────────────┴─────────┘
178 rows omittedInterpolation 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.