2016-06-22 27 views
5

Sto tentando di analizzare un elenco di date di registro su DateTime istanze, ma genera errori inesatti. Cosa sto sbagliando e come dovrei farlo nel modo giusto?Parsing date Zulu in Julia genera InexactError

julia> using Base.DateTime 

julia> readdlm("push-log.txt")[:,1] 
16-element Array{Any,1}: 
"2016-06-22T14:04:09.9896422Z" 
"2016-06-22T14:04:10.0052910Z" 
"2016-06-22T14:04:11.3177753Z" 
"2016-06-22T14:04:12.3334265Z" 
"2016-06-22T14:04:13.4896544Z" 
"2016-06-22T14:04:14.1459007Z" 
"2016-06-22T14:04:14.6459071Z" 
"2016-06-22T14:04:15.6615276Z" 
"2016-06-22T14:04:16.2084073Z" 
"2016-06-22T14:04:17.2865371Z" 
"2016-06-22T14:04:18.3490382Z" 
"2016-06-22T14:04:19.2396584Z" 
"2016-06-22T14:04:19.7709572Z" 
"2016-06-22T14:04:20.9584180Z" 
"2016-06-22T14:04:22.0209160Z" 
"2016-06-22T14:04:22.6615594Z" 

julia> map(readdlm("push-log.txt")[:,1]) do str 
      DateTime(str, "y-m-dTH:M:S.sZ") 
     end 
ERROR: InexactError() 
in slotparse at dates/io.jl:131 
in getslot at dates/io.jl:143 
in parse at dates/io.jl:158 
in anonymous at none:2 
in map at essentials.jl:153 

julia> versioninfo() 
Julia Version 0.4.6 
Commit 2e358ce (2016-06-19 17:16 UTC) 
Platform Info: 
    System: Windows (x86_64-w64-mingw32) 
    CPU: Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz 
    WORD_SIZE: 64 
    BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell) 
    LAPACK: libopenblas64_ 
    LIBM: libopenlibm 
    LLVM: libLLVM-3.3 

risposta

6

Dal docs:

Il modulo Date s fornisce due tipi per lavorare con date: Date e DateTime, che rappresenta il giorno e millisecondo precisione, rispettivamente;

(corsivo aggiunto).

Quindi, sembra piuttosto che arrotondare, DateTime lancia un InexactError durante l'analisi di un timestamp con più di tre posizioni decimali. Limitare a tre cifre decimali funziona:

julia> t = "2016-06-22T14:04:22.6615594Z" 
"2016-06-22T14:04:22.6615594Z" 

julia> DateTime(t,"y-m-dTH:M:S.sZ") 
ERROR: InexactError() 
in slotparse at dates/io.jl:131 
in getslot at dates/io.jl:143 
in parse at dates/io.jl:158 

julia> t2 = "2016-06-22T14:04:22.662Z" 
"2016-06-22T14:04:22.662Z" 

julia> DateTime(t2,"y-m-dTH:M:S.sZ") 
2016-06-22T14:04:22.662 

più conciso, DateTime non può gestire frazioni di Millisecond:

julia> Base.Dates.Millisecond(111) 
111 milliseconds 

julia> Base.Dates.Millisecond(111.1) 
ERROR: InexactError() 
in call at dates/types.jl:18 
+0

Grazie - che spiega il motivo per cui * * questo accade. Qual è il modo migliore di analizzare il mio file di registro, quindi? –

+2

Arrotondamento [sta arrivando] (https://github.com/JuliaLang/julia/pull/17037). – daycaster

+0

@daycaster fantastico, buono a sapersi! – Chris