2016-01-25 27 views
7

devo timestamp, colonna Timelocal nel mio dati che sono formattati come segue:Come convertire una data di carattere per essere utilizzabile con dplyr e RPostgreSQL?

2015-08-24T00:02:03.000Z 

Normalmente, utilizzare la seguente riga di convertire questo formato per convertirlo in un formato di data che posso usare.

timestamp2 = "2015-08-24T00:02:03.000Z" 
timestamp2_formatted = strptime(timestamp2,"%Y-%m-%dT%H:%M:%S",tz="UTC") 
    # also works for dataframes (my main use of it) 
     df$TimeNew = strptime(df$TimeLocal,"%Y-%m-%dT%H:%M:%S",tz="UTC") 

Questo funziona perfettamente sulla mia macchina. Il problema è che ora sto lavorando con un dataframe molto più grande. È su un cluster Redshift e sto accedendo utilizzando il pacchetto RPostgreSQL. Sto usando dplyr per manipolare i dati poiché la documentazione online indica che funziona bene con RPostgreSQL.

Sembra, ad eccezione della conversione del formato della data. Mi piacerebbe convertire il formato del carattere in un formato orario. Timelocal è stato letto in Redshift come "varchar". Quindi, R sta interpretandolo come un campo di caratteri.

ho provato la seguente:

library(dplyr) 
library(RPostgreSQL) 
library(lubridate) 

provare 1 - utilizzando facile sintassi dplyr

mutate(elevate, timelocalnew = fast_strptime(timelocal, "%Y-%m-%dT%H:%M:%S",tz="UTC")) 

provare 2 - utilizzando la sintassi dplyr da un altro codice di riferimento on-line

elevate %>% 
    mutate(timelocalnew = timelocal %>% fast_strptime("%Y-%m-%dT%H:%M:%S",tz="UTC") %>% as.character()) %>% 
    filter(!is.na(timelocalnew)) 

provare 3 - utilizzo strptime invece di fast_strptime

elevate %>% 
    mutate(timelocalnew = timelocal %>% strptime("%Y-%m-%dT%H:%M:%S",tz="UTC") %>% as.character()) %>% 
    filter(!is.na(timelocalnew)) 

Sto cercando di adattare il codice da qui: http://www.markhneedham.com/blog/2014/12/08/r-dplyr-mutate-with-strptime-incompatible-sizewrong-result-size/

miei tentativi sono erroring perché:

Error in postgresqlExecStatement(conn, statement, ...) : 
    RS-DBI driver: (could not Retrieve the result : ERROR: syntax error at or near "AS" 
LINE 1: ...CAST(STRPTIME("timelocal", '%YSuccess2048568264T%H%M�����', 'UTC' AS "tz") A... 
                  ^
) 
In addition: Warning messages: 
1: In postgresqlQuickSQL(conn, statement, ...) : 
    Could not create executeSELECT count(*) FROM (SELECT "timelocal", "timeutc", "zipcode", "otherdata", "country", CAST(STRPTIME("timelocal", '%Y%m%dT%H%M%S', 'UTC' AS "tz") AS TEXT) AS "timelocalnew" 
FROM "data") AS "master" 
2: Named arguments ignored for SQL STRPTIME 

Sembrerebbe che strptime è incompatibile con RPostgreSQL. Questa è la giusta interpretazione? In tal caso, significa che non vi è alcun modo per gestire i formati di data all'interno di R se i dati sono su Redshift? Ho controllato la documentazione del pacchetto RPostgreSQL e non ho visto nulla relativo alla specifica dei formati temporali.

Apprezzerebbe qualsiasi consiglio su come ottenere colonne di data e ora formattate correttamente con dplyr e RpostgreSQL.

risposta

0

Il seguente lavoro funziona?

as.Date(strptime(timelocal,format = "%YYYY/%MM/%DD %H:%M:%OS"),tz="UTC") 
0

Le funzioni R tradizionali non funzionano qui.
Il tuo dovrebbe andare con la traduzione SQL che si è evoluta nelle ultime versioni di dplyr e dbplyr.
Di seguito ha lavorato per me:

library(dbplyr) 
mutate(date = to_date(timestamp2, 'YYYY-MM-DD')) 

nota, io sto usando AWS Redshift.