2017-09-12 8 views
6

Cet extraitEn R, pourquoi ai-je une différence d'une milliseconde entre POSIXct et POSIXlt?

options(digits.secs=3) 
s<-"12:00:00.188" 
fmt<-"%I:%M:%OS" 
print(strptime(s,fmt)) 
print(as.POSIXct(strptime(s,fmt))) 

donne cette sortie textuelle:

[1] "2017-09-12 00:00:00.188 CEST" 
[1] "2017-09-12 00:00:00.187 CEST" 

alors que j'attends le résultat ci-dessus est le même. Qu'est-ce que je rate?

Mes infos de session:

print(sessionInfo()) 

donne:

R version 3.4.0 (2017-04-21) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

Matrix products: default 

locale: 
[1] LC_COLLATE=Italian_Italy.1252 LC_CTYPE=Italian_Italy.1252 LC_MONETARY=Italian_Italy.1252 LC_NUMERIC=C     
[5] LC_TIME=Italian_Italy.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] compiler_3.4.0 tools_3.4.0 

Même résultat dans Linux:

R version 3.3.3 (2017-03-06) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Debian GNU/Linux 9 (stretch) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=en_US.UTF-8  LC_NAME=C     LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.3.3 

Modifier (après Roland'scomment)

Peut-être que je me trompe, mais il me semble que 0.002 n'est pas représentable en virgule flottante, toujours avec 0,002 il n'y a pas de différence entre POSIXct et POSIXlt:

options(digits.secs=3) 
s<-"12:00:00.002" 
fmt<-"%I:%M:%OS" 
print(strptime(s,fmt)) 
print(as.POSIXct(strptime(s,fmt))) 

donne:

[1] "2017-09-12 00:00:00.002 CEST" 
[1] "2017-09-12 00:00:00.002 CEST" 
+3

Précision du point de virgule flottante? Regardez unclass (as.POSIXct (...)). – Roland

+0

@Roland s'il vous plaît voir mon edit. –

Répondre

1

vous pouvez lire à ce sujet dans la documentation pour datetime: https://stat.ethz.ch/R-manual/R-devel/library/base/html/DateTimeClasses.html

en particulier:

Classe "POSIXct" représente le nombre (signé) de secondes depuis le début de 1970 (dans le fuseau horaire UTC) en tant que vecteur numérique.

strptime et l'autre magasin de classe POSIXlt les datetimes différemment.

Donc, il y a des problèmes avec des sous-seconde précision:

Sous-deuxième précision

Classes "POSIXct" et "POSIXlt" sont capables d'exprimer des fractions de seconde. (Conversion des fractions entre les deux formes peut ne pas être exacte, mais aura mieux que la précision de la microseconde.)

Alors, vous verrez POSIXlt et strptime imprimer ces précisément:

strptime(s,fmt) 
as.POSIXlt(strptime(s,fmt), format = "%Y-%m-%d %H:%M:%OS") 

Mais, parce que POSIXct fait des calculs pour représenter la date sous forme de nombre, il peut avoir des inexactitudes en raison de la précision en virgule flottante, des secondes intercalaires, etc.