7 votes

Convertir une fraction de jour en temps POSIX dans R

J'ai un jeu de données qui encode une date-heure dans deux variables distinctes. Normalement, je devrais simplement les coller ensemble dans un fichier de type as.POSIXct et continuer. Cependant, la date est fournie sous la forme d'une chaîne de caractères, et l'heure de la journée sous la forme d'une fraction de 24 heures - par exemple, 12h est 0,5, 9h30 est 0,1458333, etc.

Il ne semble pas si difficile de convertir les jours fractionnaires en heures d'horloge, mais je préférerais utiliser une fonction préexistante si possible. Une telle fonction existe-t-elle dans la base R ? Dans un paquet ?

Si cela peut vous être utile, il s'agit d'un champ horaire Excel (xlsx) importé dans R via RODBC.

EDIT Curieusement, en revoyant ce problème, les temps sont maintenant lus en POSIXct. Je ne sais pas trop ce qu'il faut en penser.

7voto

G. Grothendieck Points 40825

El Nouvelles R 4/1 L'article du Help Desk contient une section sur la lecture des dates Excel dans R.

5voto

BondedDust Points 105234

Les valeurs POSIXct sont simplement le nombre de secondes depuis minuit GMT 1970-01-01. (Vous devez donc faire attention à votre décalage par rapport à UTC.) Vous pouvez utiliser la partie date et ajouter le nombre de jours multiplié par 24*3600 (as.Date(dtval) à votre valeur de temps * 24*3600. Gabor a indiqué l'article dans R News (qu'il a rédigé, merci, Gabor.)

Vous n'avez pas donné d'exemple de la chaîne. Si vous obtenez votre date sous la forme d'une chaîne, alors as.Date(strDate) convertira la variable "strDate" en classe Date si elle est au format "AAAA-MM-JJ" ou "AAAA/MM/JJ". Sinon, les codes de formatage se trouvent sur la page ?strptime.

Une fois que vous avez une variable classée POSIXct, vous pouvez simplement ajouter le nombre de secondes. Cet exemple ajoute 30 minutes à minuit aujourd'hui le 1er février 2011 (dans mon fuseau horaire qui est UTC-5) :

> as.POSIXct(as.Date("2011-02-01")) +30*60
[1] "2011-01-31 19:30:00 EST"

Et c'est la valeur de votre temps ajouté à mon temps de minuit :

> as.POSIXct(as.Date("2011-02-01 00:00", tzone="UTC"))+3600*5 + 3600*24*timeval
[1] "2011-02-01 03:29:59 EST"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X