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.69092 │
│ 2020-01-01T01:00:00 │ 2.10902 │
│ 2020-01-01T02:00:00 │ 3.44779 │
│ 2020-01-01T03:00:00 │ 2.95738 │
│ 2020-01-01T04:00:00 │ 3.69434 │
│ 2020-01-01T05:00:00 │ 2.37074 │
│ 2020-01-01T06:00:00 │ 3.62711 │
│ 2020-01-01T07:00:00 │ 4.89666 │
│ ⋮ │ ⋮ │
│ 2020-01-07T17:00:00 │ 14.6916 │
│ 2020-01-07T18:00:00 │ 15.6407 │
│ 2020-01-07T19:00:00 │ 16.1868 │
│ 2020-01-07T20:00:00 │ 19.2493 │
│ 2020-01-07T21:00:00 │ 17.0703 │
│ 2020-01-07T22:00:00 │ 16.8454 │
│ 2020-01-07T23:00:00 │ 16.6527 │
└─────────────────────┴─────────┘
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.69092 │
│ 2020-01-01T00:15:00 │ 1.69092 │
│ 2020-01-01T00:30:00 │ 1.69092 │
│ 2020-01-01T00:45:00 │ 1.69092 │
│ 2020-01-01T01:00:00 │ 2.10902 │
│ 2020-01-01T01:15:00 │ 2.10902 │
│ 2020-01-01T01:30:00 │ 2.10902 │
│ 2020-01-01T01:45:00 │ 2.10902 │
│ ⋮ │ ⋮ │
│ 2020-01-07T21:30:00 │ 17.0703 │
│ 2020-01-07T21:45:00 │ 17.0703 │
│ 2020-01-07T22:00:00 │ 16.8454 │
│ 2020-01-07T22:15:00 │ 16.8454 │
│ 2020-01-07T22:30:00 │ 16.8454 │
│ 2020-01-07T22:45:00 │ 16.8454 │
│ 2020-01-07T23:00:00 │ 16.6527 │
└─────────────────────┴─────────┘
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.69092 │
│ 2020-01-01T00:15:00 │ 1.69092 │
│ 2020-01-01T00:30:00 │ 1.69092 │
│ 2020-01-01T00:45:00 │ 1.69092 │
│ 2020-01-01T01:00:00 │ 2.10902 │
│ 2020-01-01T01:15:00 │ 2.10902 │
│ 2020-01-01T01:30:00 │ 2.10902 │
│ 2020-01-01T01:45:00 │ 2.10902 │
│ ⋮ │ ⋮ │
│ 2020-01-01T22:30:00 │ 7.08305 │
│ 2020-01-01T22:45:00 │ 7.08305 │
│ 2020-01-01T23:00:00 │ 9.23726 │
│ 2020-01-01T23:15:00 │ 9.23726 │
│ 2020-01-01T23:30:00 │ 9.23726 │
│ 2020-01-01T23:45:00 │ 9.23726 │
│ 2020-01-02T00:00:00 │ 8.69711 │
└─────────────────────┴─────────┘
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.69092 │
│ 2020-01-01T00:15:00 │ 1.69092 │
│ 2020-01-01T00:30:00 │ 1.69092 │
│ 2020-01-01T00:45:00 │ 1.69092 │
│ 2020-01-01T01:00:00 │ 2.10902 │
│ 2020-01-01T01:15:00 │ 2.10902 │
│ 2020-01-01T01:30:00 │ 2.10902 │
│ 2020-01-01T01:45:00 │ 2.10902 │
│ ⋮ │ ⋮ │
│ 2020-01-02T18:00:00 │ 18.1309 │
│ 2020-01-02T19:00:00 │ 17.976 │
│ 2020-01-02T20:00:00 │ 16.0321 │
│ 2020-01-02T21:00:00 │ 14.4996 │
│ 2020-01-02T22:00:00 │ 14.3945 │
│ 2020-01-02T23:00:00 │ 15.0215 │
│ 2020-01-03T00:00:00 │ 14.1994 │
└─────────────────────┴─────────┘
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.69092 │
│ 2020-01-01T00:15:00 │ 1.79545 │
│ 2020-01-01T00:30:00 │ 1.89997 │
│ 2020-01-01T00:45:00 │ 2.0045 │
│ 2020-01-01T01:00:00 │ 2.10902 │
│ 2020-01-01T01:15:00 │ 2.44371 │
│ 2020-01-01T01:30:00 │ 2.77841 │
│ 2020-01-01T01:45:00 │ 3.1131 │
│ ⋮ │ ⋮ │
│ 2020-01-07T21:30:00 │ 16.9579 │
│ 2020-01-07T21:45:00 │ 16.9017 │
│ 2020-01-07T22:00:00 │ 16.8454 │
│ 2020-01-07T22:15:00 │ 16.7973 │
│ 2020-01-07T22:30:00 │ 16.7491 │
│ 2020-01-07T22:45:00 │ 16.7009 │
│ 2020-01-07T23:00:00 │ 16.6527 │
└─────────────────────┴─────────┘
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 │ 2.7117 │
│ 2020-01-01T06:00:00 │ 4.66567 │
│ 2020-01-01T12:00:00 │ 7.9723 │
│ 2020-01-01T18:00:00 │ 8.29811 │
│ 2020-01-02T00:00:00 │ 9.96222 │
│ 2020-01-02T06:00:00 │ 13.8794 │
│ 2020-01-02T12:00:00 │ 16.9426 │
│ 2020-01-02T18:00:00 │ 16.0091 │
│ ⋮ │ ⋮ │
│ 2020-01-06T06:00:00 │ 18.75 │
│ 2020-01-06T12:00:00 │ 21.5736 │
│ 2020-01-06T18:00:00 │ 17.2187 │
│ 2020-01-07T00:00:00 │ 17.6017 │
│ 2020-01-07T06:00:00 │ 18.3089 │
│ 2020-01-07T12:00:00 │ 16.213 │
│ 2020-01-07T18:00:00 │ 16.9409 │
└─────────────────────┴─────────┘
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 │ 7.08305 │
│ 2020-01-01T22:45:00 │ 7.08305 │
│ 2020-01-01T23:00:00 │ 9.23726 │
│ 2020-01-01T23:15:00 │ 9.23726 │
│ 2020-01-01T23:30:00 │ 9.23726 │
│ 2020-01-01T23:45:00 │ 9.23726 │
│ 2020-01-02T00:00:00 │ 8.69711 │
└─────────────────────┴─────────┘
178 rows omitted