Conversion du numéro de série excel DateTime en R DateTime

Lorsque les tables excel sont importées en tant que points xy dans ArcGIS, je continue à perdre mon horodatage correct pour chaque point. Ainsi, j'ai formaté le numéro de série DateTime, créé le .shp, et lire la .shp dans R en utilisant readOGR ().

Une fois dans R, je peux convertir à la date correcte en utilisant as.Date() et l'argument origin = "1899-12-30", mais le temps est laissé de côté. Bien que j'ai vu des exemples avec une seule Date, je n'ai pas vu d'exemples travaillés avec DateTime. J'ai utilisé as.Date() ainsi que as.POSIXct() mais ceci tâche apparemment simple comme été un peu frustrant, donc le poste ...

J'ai créé un exemple de jeu de données avec 10 lignes du format DateTime correct ainsi que le numéro de série excel.

*Merci Richard et thelatemail pour leur oeil vif sur un obstacle plus tôt. J'ai corrigé les données et re-posté ici.

Voici mes exemples de données

helpData <- structure(list(ID = 1:10, DateTime = structure(c(9L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 8L), .Label = c("3/11/2011 7:55", "3/13/2011 7:55", 
"3/14/2011 0:00", "3/14/2011 10:04", "3/14/2011 7:55", "3/15/2011 19:55", 
"3/17/2011 7:55", "3/18/2011 4:04", "3/4/2011 6:00"), class = "factor"), 
ExcelNum = c(40606.25, 40613.32986, 40615.32986, 40616, 40616.41944, 
40616.32986, 40617.82986, 40619.32986, 40620.16944, 40620.16944
)), .Names = c("ID", "DateTime", "ExcelNum"), class = "data.frame", row.names = c(NA, 
-10L))

head(helpData)

Le DateTime est GMT. L'heure est une horloge de 24 heures (c'est-à-dire pas AM/PM). Je travaille sur Windows 7, ai le plus récent R, et ArcGIS 10.

Le code ci-dessous obtient la Date correcte, mais l'heure est toujours manquante.

newDateTime <- as.Date(helpData[ , "ExcelNum"], origin = "1899-12-30")
head(newDateTime)

Merci d'avance!

25
r
demandé sur B. Davis 2013-10-04 07:20:12

4 réponses

Votre numéro compte les jours. Convertir en secondes, et vous êtes tous ensemble (moins une erreur d'arrondi)

helpData[["ExcelDate"]] <- 
  as.POSIXct(helpData[["ExcelNum"]] * (60*60*24)
    , origin="1899-12-30"
    , tz="GMT")


#     ID        DateTime ExcelNum           ExcelDate
#  1   1   3/4/2011 6:00 40606.25 2011-03-04 06:00:00
#  2   2  3/11/2011 7:55 40613.33 2011-03-11 07:54:59
#  3   3  3/13/2011 7:55 40615.33 2011-03-13 07:54:59
#  4   4  3/14/2011 0:00 40616.00 2011-03-14 00:00:00
#  5   5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59
#  6   6  3/14/2011 7:55 40616.33 2011-03-14 07:54:59
#  7   7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59
#  8   8  3/17/2011 7:55 40619.33 2011-03-17 07:54:59
#  9   9  3/18/2011 4:04 40620.17 2011-03-18 04:03:59
#  10 10  3/18/2011 4:04 40620.17 2011-03-18 04:03:59
39
répondu Ricardo Saporta 2013-10-04 04:19:00

Les données temporelles sont toujours là, elles ne sont tout simplement pas affichées-voir:

as.numeric(newDateTime)
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc

Si vous souhaitez travailler avec des parties de jours, il est probablement préférable d'utiliser les représentations POSIXct. Pour ce faire, vous pouvez convertir en Date, puis convertir en POSIXct, bien que cela mette en jeu des problèmes de fuseau horaire si vous voulez faire une comparaison directe avec votre colonne DateTime.

helpData$newDate <- as.POSIXct(as.Date(helpData$ExcelNum,origin="1899-12-30"))
attr(helpData$newDate,"tzone") <- "UTC"
helpData

#   ID        DateTime ExcelNum             newDate
#1   1   3/4/2011 6:00 40606.25 2011-03-04 06:00:00
#2   2  3/11/2011 7:55 40613.33 2011-03-11 07:54:59
#3   3  3/13/2011 7:55 40615.33 2011-03-13 07:54:59
#4   4  3/14/2011 0:00 40616.00 2011-03-14 00:00:00
#5   5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59
#6   6  3/14/2011 7:55 40616.33 2011-03-14 07:54:59
#7   7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59
#8   8  3/17/2011 7:55 40619.33 2011-03-17 07:54:59
#9   9  3/18/2011 4:04 40620.17 2011-03-18 04:03:59
#10 10  3/18/2011 4:04 40620.17 2011-03-18 04:03:59
9
répondu thelatemail 2013-10-04 04:48:01

Voici une autre façon de le faire en utilisant les paquets janitor et tibble:

install.packages("janitor")

install.packages("tibble")

library(tibble)

library(janitor)

excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern")
3
répondu Reza Rahimi 2017-10-23 17:56:04

Utilisez la fonction convertToDateTime. Il est simple. Voici un exemple:

library(openxlsx)
convertToDateTime(helpData$ExcelNum, origin = "1900-01-01")

Faites-moi savoir comment cela fonctionne.

3
répondu user8436447 2018-07-02 12:28:03