Gibt es eine spezielle Möglichkeit, mit Zeitstempelspalten in R umzugehen, wenn Daten mit RPostgreSQL abgerufen werden?

Ich versuche, Daten aus einer PostgreSQL-Datenbank abzurufen, und die Ergebnisse für ein Zeitstempelfeld sind inkonsistent. Ich bin nicht sicher, ob ich mit POSIXct-Ergebnissen richtig umgehe. Ansonsten habe ich einen Fehler im RPostgreSQL-Paket gefunden. So replizieren Sie das Problem:

Angenommen, es gibt eine Tabelle in einer Postgres-Datenbank mit einem Feld (führen Sie dies in PostgreSQL aus):

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;

Nehmen wir an, es gibt ein paar hundert Datensätze. Ich werde sie in R füllen. Hier ist der Code:

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)

Wenn ich versuche, die Werte abzurufen, wird die Zeitkomponente aus den resultierenden Daten entfernt

res <- dbGetQuery(con, "SELECT * FROM test_table")
res[1:20,1]

Die Klasse des Ergebnisses ist jedoch POSIXct

class(res[,1])

Wenn das Ergebnis nacheinander abgerufen wird, verlieren die Werte mit Stunde: Minute gleich 00:00 die Zeitkomponente:

rs <- dbSendQuery(con, "SELECT \"DateTime\" FROM test_table")
res_list <- list()
for(i in 1:100) res_list[i]  <- fetch(rs,1)
res_list

Um dieses Problem zu umgehen, rufe ich jeweils den Datensatz mit dem Ergebnis 1 ab, korrigiere ihn und füge ihn zu einem data.frame zusammen. Dies ist jedoch sehr zeitaufwendig, insbesondere bei großen Datenmengen. Irgendwelche Ideen, warum dies geschieht und wie mit diesem Problem umgegangen werden soll?

Danke im Voraus!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage