Bir PostgreSQL veritabanından veri çekmeye çalışıyorum ve zaman damgası alanı sonuçları tutarsız. POSIXct sonuçlarını doğru kullanıp kullanmadığımı bilmiyorum. Aksi halde, RPostgreSQL paketinde bir hata buldum.RPostgreSQL kullanarak verileri çekerken R'de zaman damgası sütunlarını işlemenin belirli bir yolu var mı?
bir alanda (PostgreSQL bu çalıştırın) ile postgres veritabanı bir tablo bulunduğunu varsayalım:
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;
Ve en birkaç yüz kayıtları vardır diyelim Burada konuyu çoğaltmak için bir yoldur. Ben değerlerini almaya çalışırsanız
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)
, zaman bileşeni ortaya çıkan verilerin
res <- dbGetQuery(con, "SELECT * FROM test_table")
res[1:20,1]
sonucun sınıf dışına soyulmuş alır: R. İşte kod içinde onları dolduracaktır sonuç, her seferinde bir kayıt, bir saat ile değerleri getirilen, ancak, POSIXct
class(res[,1])
olup:
012.351: 00-00 eşit dakika zaman bileşeni gevşekrs <- dbSendQuery(con, "SELECT \"DateTime\" FROM test_table")
res_list <- list()
for(i in 1:100) res_list[i] <- fetch(rs,1)
res_list
Bir geçici çözüm olarak, sonuç 1 kayıtlarını bir seferde getiriyorum, bir sabitleme ve bir data.frame içine topluyorum. Ancak bu, özellikle büyük veri kümeleri için çok zaman alıcıdır. Bunun neden olduğu ve bu konuyla nasıl baş edileceğine dair herhangi bir fikir var mı?
Şimdiden teşekkürler!
Yukarıda belirtildiği gibi, 'CREATE TABLE' ifadesinde ' timezon'lu zaman damgası kullanılarak benim için numara oldu.Sorunun gerçekten bir parçası olmasa da, deneyimlerime göre dbWriteTable'ın SQL tablo isimlerini yazarken belirttiği ** büyük harflerden hoşlanmadığını buldum. – bibzzzz