2015-09-10 1 views
0

le temps mes données sont dans EST fuseau horaire, et j'essaie d'utiliser ce fuseau horaire.pourquoi l'heure locale ne fonctionne pas? POSIXct dans le fuseau horaire spécifique [R]

Je veux compter de la semaine (en heure locale, pas GMT), donc je définis manuellement un originTime dans EDT

originTime = as.POSIXlt('2000-01-02 00:00:00 EDT') 
dt2 = data.frame(time=c(as.POSIXlt('2000-01-09 00:00:05 EDT'))) 
dt2$week = as.integer(floor((as.numeric(dt2$time) - as.numeric(originTime)) /(3600*24*7))) 
dt2$wday = weekdays(dt2$time) 

Cela fonctionne.

Maintenant, je veux savoir, ce qui est une semaine après un moment donné?

> as.POSIXlt(1 * 3600*24*7 , origin = originTime) 
[1] "2000-01-08 19:00:00 EST" 

est ici le problème, R semble penser originTime est en GMT. Quelqu'un peut-il aider? Merci

+0

Désolé manqué une ligne de code. Voir OP s'il vous plaît @ Richard Scriven –

Répondre

1

Deux problèmes sérieux. EDT n'existe pas vraiment, et même si c'était le cas, cela ne serait pas approprié pour une date de janvier. Le fuseau horaire de l'Est (États-Unis) est «EST5EDT» pour le distinguer de l'EST Ozzie. (En outre, ceux-ci peuvent être différents sur différentes OS.) Safest serait tz="America/New_York". Pour la saisie de données, vous devez utiliser le « tz » paramètre et modifiez le paramètre par défaut (FAUX) de « usetz »:

(originTime = as.POSIXlt('2000-01-02 00:00:00', format="%Y-%m-%d %H:%M:%S", 
          tz="EST5EDT", usetz=TRUE)) 
[1] "2000-01-02 EST" 

Un test utilisant « % Z » qui est seulement pour la sortie:

> format(as.POSIXlt('2000-01-02 00:00:00', format="%Y-%m-%d %H:%M:%S", 
              tz="America/New_York", usetz=TRUE) , 
     format="%Y-%m-%d %H:%M:%S %Z") 
[1] "2000-01-02 00:00:00 EST" 

Je ne l'ai jamais utilisé l'argument d'origine dans as.POSIXlt ne peut donc pas vraiment expliquer pourquoi il ne parvient pas à livrer le résultat attendu que je l'ai toujours utilisé +.POSIXt ou seq.POSIXt pour construire des intervalles:

format(as.POSIXlt('2000-01-02 00:00:00', tz="America/New_York", usetz=TRUE)+ 1*3600*24*7, 
     format="%Y-%m-%d %H:%M:%S %Z") # %Z is only used for output 
# [1] "2000-01-09 00:00:00 EST" A week later at midnight. 

Je pense que la raison pour laquelle on doit forcer une impression temporelle avec un argument de format est que les heures de minuit sont raccourcies à l'impression de la date sans autre information H: M: S.

+0

Vous pouvez également utiliser 'tz =" US/Eastern "' –

+0

Je suis d'accord que le problème principal ici est timestamp est incorrectement formaté. Un point important dans cette réponse est que EST et EDT ne sont pas des zones mais des décalages par rapport à l'UTC (-5 et -4, respectivement). La bonne chose à propos de la spécification d'une zone est que les décalages sont automatiquement appliqués en fonction de l'heure locale dans une zone donnée. Mais si, pour une raison quelconque, votre temps est en EDT pendant le mois de janvier, alors vous voudrez utiliser le format '% Z' dans' as.POSIXlt' pour spécifier le décalage par rapport à l'UTC plutôt qu'à la zone. –

+1

Ah, oui. Un exemple de «droits des États», une tradition Murkin sanctifiée. Sur ma machine il y a un '../zoneinfo/US/ directory' dont le contenu est:' "Alaska" \t, "Central", "Hawaii", "Montagne", "Samoa", "Aleutian", "East-Indiana" "," Indiana-Starke "," Pacifique "," Arizona "," Eastern "," Michigan "," Pacific-New "' –