timezone - que - reloj analogico hora actual
Convertir a hora local en R-Vector de zonas horarias (3)
Así que pude crear un bucle for para hacer esto, pero es lento, tarda unos 10 minutos en ejecutarse. No pude entender un sytnax de apply()
, y ciertamente apreciaría algo de ayuda para crear una forma más rápida y más paralela de realizar esta operación, ya que el almacén de datos tiene 768k de observaciones y sigue creciendo.
> require(lubridate)
>
> loct = NULL for (i in 1:nrow(DS))
> {
> loct[i] <- with_tz(DS$UTC[i],tzone =
> ifelse(DS$timezone[i]=="","US/Eastern",as.character(DS$timezone[i])))
> } DS$localtime <- as.POSIXct(loct, origin ="1970-01-01") remove (loct, i)
Tengo un conjunto de datos de todos los EE. UU. Que intento convertir a hora local para cada "sujeto". Tengo marcas de tiempo UTC en cada evento y las he convertido en formato POSIXct, pero cada vez trato de incluir un vector de tz = DS$Factor
o tz = as.character(DS$Factor)
en cualquiera de las funciones POSIXct / POSIXlt ( incluyendo format()
y strftime()
) Recibo un error que dice:
Error en as.POSIXlt.POSIXct (x, tz = tz): valor "tz" no válido
Si acabo de ingresar tz = ''US/Eastern''
funciona bien, pero, por supuesto, no todos mis valores provienen de esa zona horaria.
¿Cómo obtengo las marcas de tiempo en la hora local para cada "sujeto"?
El DS$Factor
tiene 5 valores: EE. UU. / Arizona EE. UU./Central EE. UU./Estados Unidos / Montaña EE. UU./Pacífico
Gracias, Taquigrafía
En realidad, lo que hice fue recorrer las zonas horarias en lugar del número de filas en el conjunto de datos ... luego es mucho, mucho más rápido. Voy a publicar el código mañana.
En general, esa es una lección para R: no recorra el cuadro de Big Data, recorra el vector de categorías (mucho más corto) y aplique usando la función which ().
Como solo hay 5 zonas horarias, el ciclo solo lleva unos segundos.
Otra advertencia es que si lo coloca en formato POSIXct, seguirá graficando los tiempos en la zona horaria local de su máquina. Entonces necesitas un paso adicional para luego convertirlo a la hora local usando force_tz ().
cap $ tdiff se acaba de crear para asegurarse de que el código está haciendo lo que dice que debería estar haciendo.
library("lubridate")
tzs <- as.character(unique(cap$timezone))
cap$localtimes <- as.POSIXlt(0,origin = "1970-01-01")
#now loop through by timezone instead of lines of cap[]
for (i in 1:length(tzs)) {
whichrows <- which(cap$timezone == tzs[i])
cap[whichrows,"localtimes"] <-
with_tz(cap[whichrows,"UTC"],tzone = tzs[i])
}
remove(i, whichrows)
cap$tdiff <- as.numeric((force_tz(cap$localtime, "UTC") - cap$UTC))
cap$localtime <- as.POSIXct(force_tz(cap$localtimes))
Trayendo dplyr y lubridate, terminé haciendo algo como:
require(lubridate)
require(dplyr)
df = data.frame(timestring = c("2015-12-12 13:34:56", "2015-12-14 16:23:32"),
localzone = c("America/Los_Angeles", "America/New_York"), stringsAsFactors = F)
df$moment = as.POSIXct(df$timestring, format="%Y-%m-%d %H:%M:%S", tz="UTC")
df = df %>% rowwise() %>% mutate(localtime = force_tz(moment, localzone))
df