Skip to content

Julia "Dates"

Alexander Belopolsky edited this page Sep 13, 2017 · 3 revisions

Let's write a simple function to explore subtypes

julia> function typetree(T, indent=0)
         println("  "^indent, T)
         for S in subtypes(T)
           typetree(S, indent+1)
         end
       end
typetree (generic function with 2 methods)
julia> typetree(Dates.AbstractTime)
Base.Dates.AbstractTime
  Base.Dates.Calendar
    Base.Dates.ISOCalendar
  Base.Dates.CompoundPeriod
  Base.Dates.Instant
    Base.Dates.UTInstant
  Base.Dates.Period
    Base.Dates.DatePeriod
      Base.Dates.Day
      Base.Dates.Month
      Base.Dates.Week
      Base.Dates.Year
    Base.Dates.TimePeriod
      Base.Dates.Hour
      Base.Dates.Microsecond
      Base.Dates.Millisecond
      Base.Dates.Minute
      Base.Dates.Nanosecond
      Base.Dates.Second
  Base.Dates.TimeType
    Base.Dates.Time
    Date
    DateTime

AbstractTime

AbstractTime is at the top of the hierarchy and has no defined methods.

julia> methodswith(Dates.AbstractTime)
0-element Array{Method,1}

Period

Is similar to Python's timedelta or q timespan. Addition and subtraction results in CompoundPeriod:

julia> Dates.Day(2)+Dates.Hour(3)
2 days, 3 hours

julia> typeof(ans)
Base.Dates.CompoundPeriod

Period types are expected to have toms method defined

julia> methods(Dates.toms)
# 11 methods for generic function "toms":
toms(c::Base.Dates.CompoundPeriod) in Base.Dates at dates/periods.jl:460
toms(c::Base.Dates.Year) in Base.Dates at dates/periods.jl:459
toms(c::Base.Dates.Month) in Base.Dates at dates/periods.jl:458
toms(c::Base.Dates.Week) in Base.Dates at dates/periods.jl:457
toms(c::Base.Dates.Day) in Base.Dates at dates/periods.jl:456
toms(c::Base.Dates.Hour) in Base.Dates at dates/periods.jl:455
toms(c::Base.Dates.Minute) in Base.Dates at dates/periods.jl:454
toms(c::Base.Dates.Second) in Base.Dates at dates/periods.jl:453
toms(c::Base.Dates.Millisecond) in Base.Dates at dates/periods.jl:452
toms(c::Base.Dates.Microsecond) in Base.Dates at dates/periods.jl:451
toms(c::Base.Dates.Nanosecond) in Base.Dates at dates/periods.jl:450

Issues

eps should be defined for types rather than instances. Something like this:

eps(t::AbstractTime) = eps(typeof(t))
eps(::Type{Date}) = Day(1)
..

Compare temporal and numeric types below.

julia> methods(eps)
# 9 methods for generic function "eps":
eps(t::Base.Dates.Time) in Base.Dates at dates/types.jl:331
eps(dt::Date) in Base.Dates at dates/types.jl:330
eps(dt::DateTime) in Base.Dates at dates/types.jl:329
eps() in Base at float.jl:715
eps(x::AbstractFloat) in Base at float.jl:711
eps(::Type{Float16}) in Base at float.jl:712
eps(::Type{Float32}) in Base at float.jl:713
eps(::Type{Float64}) in Base at float.jl:714
eps(::Type{BigFloat}) in Base.MPFR at mpfr.jl:854
Clone this wiki locally