From b39c4fc1159b1de2e8ae6e70da1ff3d41e963934 Mon Sep 17 00:00:00 2001 From: Rafael Schouten Date: Tue, 5 Nov 2024 17:53:05 +0100 Subject: [PATCH] Implement `bounds` and `intervalbounds` for `Center` locus with `DateTime` (#846) * fix intervalbounds for datetime * fix and test Center DateTime * cleanup --- src/Lookups/lookup_arrays.jl | 27 +++++++++++++++++++-------- test/lookup.jl | 13 +++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/Lookups/lookup_arrays.jl b/src/Lookups/lookup_arrays.jl index 25340b132..2d7a0fa18 100644 --- a/src/Lookups/lookup_arrays.jl +++ b/src/Lookups/lookup_arrays.jl @@ -223,14 +223,20 @@ _bounds(::ReverseOrdered, ::Intervals, span::Explicit, ::AbstractSampled) = (val(span)[1, end], val(span)[2, 1]) _bounds(::Intervals, span::Regular, lookup::AbstractSampled) = _bounds(locus(lookup), order(lookup), span, lookup) -_bounds(::Start, ::ForwardOrdered, span, lookup) = first(lookup), last(lookup) + step(span) -_bounds(::Start, ::ReverseOrdered, span, lookup) = last(lookup), first(lookup) - step(span) -_bounds(::Center, ::ForwardOrdered, span, lookup) = - first(lookup) - step(span) / 2, last(lookup) + step(span) / 2 -_bounds(::Center, ::ReverseOrdered, span, lookup) = - last(lookup) + step(span) / 2, first(lookup) - step(span) / 2 -_bounds(::End, ::ForwardOrdered, span, lookup) = first(lookup) - step(span), last(lookup) -_bounds(::End, ::ReverseOrdered, span, lookup) = last(lookup) + step(span), first(lookup) +_bounds(::Start, ::ForwardOrdered, span::Regular, lookup) = first(lookup), last(lookup) + step(span) +_bounds(::Start, ::ReverseOrdered, span::Regular, lookup) = last(lookup), first(lookup) - step(span) +function _bounds(::Center, order::Ordered, span::Regular, lookup) + bounds = first(lookup) - step(span) / 2, last(lookup) + step(span) / 2 + return _maybeflipbounds(order, bounds) +end +# DateTime handling +function _bounds(::Center, order::Ordered, span::Regular, lookup::Lookup{<:Dates.AbstractTime}) + f, l, s = first(lookup), last(lookup), step(span) + bounds = (f - (f - (f - s)) / 2, l - (l - (l + s)) / 2) + _maybeflipbounds(order, bounds) +end +_bounds(::End, ::ForwardOrdered, span::Regular, lookup) = first(lookup) - step(span), last(lookup) +_bounds(::End, ::ReverseOrdered, span::Regular, lookup) = last(lookup) + step(span), first(lookup) const SAMPLED_ARGUMENTS_DOC = """ @@ -651,6 +657,11 @@ function intervalbounds(order::Ordered, locus::Center, span::Regular, l::Lookup, bounds = (x - halfstep, x + halfstep) return _maybeflipbounds(order, bounds) end +function intervalbounds(order::Ordered, locus::Center, span::Regular, l::LookupArray{<:Dates.AbstractTime}, i::Int) + x = l[i] + bounds = (x - (x - step(span))) / 2 + x, (x - (x + step(span))) / 2 + x + return _maybeflipbounds(order, bounds) +end # Irregular Center function intervalbounds(order::ForwardOrdered, locus::Center, span::Irregular, l::Lookup, i::Int) x = l[i] diff --git a/test/lookup.jl b/test/lookup.jl index 3fcde1d2c..18eb502e0 100644 --- a/test/lookup.jl +++ b/test/lookup.jl @@ -1,4 +1,5 @@ using DimensionalData, Test, Unitful +using Dates using DimensionalData.Lookups, DimensionalData.Dimensions using DimensionalData.Lookups: _slicespan, isrev, _bounds using DimensionalData.Dimensions: _slicedims @@ -112,6 +113,18 @@ end @testset "bounds and intervalbounds" begin @testset "Intervals" begin @testset "Regular bounds are calculated from interval type and span value" begin + @testset "Forward Center DateTime" begin + ind = DateTime(2000):Month(1):DateTime(2000, 11) + dim = format(X(ind; sampling=Intervals(Center()))) + @test bounds(dim) == (DateTime(1999, 12, 16, 12), DateTime(2000, 11, 16)) + @test intervalbounds(dim, 3) == (DateTime(2000, 03, 15, 12), DateTime(2000, 02, 14, 12)) + end + @testset "Reverse Center DateTime" begin + ind = DateTime(2000, 11):Month(-1):DateTime(2000, 1) + dim = format(X(ind; sampling=Intervals(Center()))) + @test bounds(dim) == (DateTime(1999, 12, 16, 12), DateTime(2000, 11, 16)) + @test intervalbounds(dim, 3) == (DateTime(2000, 09, 16, 12), DateTime(2000, 08, 17)) + end @testset "forward ind" begin ind = 10.0:10.0:50.0 dim = X(Sampled(ind, order=ForwardOrdered(), sampling=Intervals(Start()), span=Regular(10.0)))