tk3369 / SASLib.jl

Julia library for reading SAS7BDAT data sets
Other
34 stars 7 forks source link

Timestamp data should be more precise #11

Open tk3369 opened 6 years ago

tk3369 commented 6 years ago

This code could be improved as x[i] is a floating point value of # of seconds since epoch. By multiplying it by 1e3 or 1e6 would allow us to read the data as in millisecond/microseconds. Need to cross check what precision SAS can support.

# convert Float64 value into DateTime object 
function datetime_from_float(x::Vector{Float64})
    v = Vector{Union{DateTime, Missing}}(length(x))
    for i in 1:length(x)
        v[i] = isnan(x[i]) ? missing : (sas_datetime_origin + Dates.Second(round(Int64, x[i])))
    end
    v
end
tbeason commented 3 years ago

Following up on this, I made a function that helped me, maybe it could be useful here. It only covers the case of Time columns (not DateTime)

seconds2time(t) = Time(Nanosecond(round(t,digits=9) * 1e9))
julia> seconds2time(34200)
09:30:00

julia> seconds2time(34200.0356466666)
09:30:00.035646667

I explicitly round it to nanoseconds because that is the smallest unit that the Dates.jl standard library supports. This is likely sufficient for most usage, I'd guess.