diff --git a/src/DatasetAPI/Datasets.jl b/src/DatasetAPI/Datasets.jl index 8ad7112ef..28587a144 100644 --- a/src/DatasetAPI/Datasets.jl +++ b/src/DatasetAPI/Datasets.jl @@ -3,10 +3,10 @@ module Datasets import ..Cubes: Cubes, YAXArray, concatenatecubes, CleanMe, subsetcube, copy_diskarray, setchunks, caxes, readcubedata, cubesize, formatbytes using ...YAXArrays: YAXArrays, YAXDefaults, findAxis using DataStructures: OrderedDict, counter -using Dates: Day, Hour, Minute, Second, Month, Year, Date, DateTime, TimeType, AbstractDateTime, Period +using Dates: Day, Hour, Minute, Second, Month, Year, Date, DateTime, TimeType, AbstractDateTime, Period, Dates using Statistics: mean using IntervalSets: Interval, (..) -using CFTime: timedecode, timeencode, DateTimeNoLeap, DateTime360Day, DateTimeAllLeap +using CFTime: timedecode, timeencode, DateTimeNoLeap, DateTime360Day, DateTimeAllLeap, CFTime using YAXArrayBase using YAXArrayBase: iscontdimval, add_var using DiskArrayTools: CFDiskArray, diskstack @@ -273,6 +273,12 @@ function collectdims(g) outd end +function round_datetime(dt) + origin = CFTime._origin_period(dt) + ms = Dates.Millisecond(round(Int, (dt.instant + origin + CFTime.DATETIME_OFFSET).duration)) + return DateTime(CFTime.UTInstant{Dates.Millisecond}(ms)) +end + function toaxis(dimname, g, offs, len) axname = Symbol(dimname) if !haskey(g, dimname) @@ -282,7 +288,8 @@ function toaxis(dimname, g, offs, len) aratts = get_var_attrs(g, dimname) if match(r"^(days)|(hours)|(seconds)|(months) since",lowercase(get(aratts,"units",""))) !== nothing tsteps = try - timedecode(ar[:], aratts["units"], lowercase(get(aratts, "calendar", "standard"))) + dec = timedecode(ar[:], aratts["units"], lowercase(get(aratts, "calendar", "standard")), prefer_datetime=false) + round_datetime.(dec) catch ar[:] end