Sto provando a estrarre dati da un database PostgreSQL e i risultati per un campo data/ora sono incoerenti. Non sono sicuro di gestire correttamente i risultati POSIXct. Altrimenti, penso di aver trovato un bug nel pacchetto RPostgreSQL. Ecco il modo per replicare il problema:Esiste un modo specifico per gestire le colonne di timestamp in R quando si estraggono dati utilizzando RPostgreSQL?
Supponiamo che ci sia una tabella di un database Postgres con un campo (eseguire questo in PostgreSQL):
CREATE DATABASE mydb;
CREATE TABLE test_table
(
"DateTime" timestamp without time zone NOT NULL,
CONSTRAINT "pk_test_table" PRIMARY KEY ("DateTime")
)
WITH (
OIDS=FALSE
);
ALTER TABLE test_table
OWNER TO postgres;
E diciamo ci sono poche centinaia di record. Io li popolerà in R. Ecco il codice:
library(RPostgreSQL)
# Let's feed the table with some sequence of date/time values
date_values <- as.chron(seq(10000, 10500, 1/24))
format.chron <- function(z) {
sprintf("%04.0f-%02.0f-%02.0f %02.0f:%02.0f:00",
as.numeric(as.character(years(z))),
months(z),
as.numeric(as.character(days(z))),
as.numeric(as.character(hours(z))),
as.numeric(as.character(minutes(z))))
}
.generateInsertQuery <- function(date_values, field_name, table_name) {
insert_val <- paste(paste0("(", sQuote(format(date_values)), ")"), collapse=',')
qry <- paste("INSERT INTO", dQuote(table_name), paste0("(", dQuote(field_name), ")"), "VALUES", insert_val)
qry
}
drv <- dbDriver('PostgreSQL')
con <- dbConnect(drv, user='postgres', dbname='mydb')
qry <- .generateInsertQuery(date_values, "DateTime", "test_table")
dbSendQuery(con, qry)
Se provo ad ottenere i valori, la componente temporale viene spogliato fuori dei dati risultanti
res <- dbGetQuery(con, "SELECT * FROM test_table")
res[1:20,1]
La classe del risultato, tuttavia, è POSIXct
class(res[,1])
Se il risultato è prelevato un record alla volta, i valori con ore: min pari a 00:00 perdere la componente temporale:
012.rs <- dbSendQuery(con, "SELECT \"DateTime\" FROM test_table")
res_list <- list()
for(i in 1:100) res_list[i] <- fetch(rs,1)
res_list
Come soluzione temporanea, sto recuperando il risultato 1 record alla volta, correggendolo e aggregandoli in un data.frame. Ma questo richiede molto tempo, soprattutto per i grandi set di dati. Qualche idea sul perché questo sta accadendo e su come affrontare questo problema?
Grazie in anticipo!
Come accennato in precedenza, l'uso di 'timestamp with timezone' nell'istruzione' CREATE TABLE' ha fatto il trucco per me.Anche se non è davvero parte della domanda, nella mia esperienza ho trovato che 'dbWriteTable' non ama ** qualsiasi ** maiuscola quando si specificano i nomi delle tabelle SQL su cui scrivere. – bibzzzz