Tôi đang cố gắng lấy dữ liệu từ cơ sở dữ liệu PostgreSQL và kết quả cho trường dấu thời gian không nhất quán. Tôi không chắc chắn nếu tôi xử lý kết quả POSIXct đúng cách. Nếu không, tôi nghĩ rằng tôi đã tìm thấy một lỗi trong gói RPostgreSQL. Dưới đây là cách để tái tạo vấn đề:Có cách nào cụ thể để xử lý các cột dấu thời gian trong R khi kéo dữ liệu bằng cách sử dụng RPostgreSQL không?
Giả sử có một bảng trong một cơ sở dữ liệu Postgres với một lĩnh vực (chạy trong 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;
Và giả sử có một vài trăm hồ sơ. Tôi sẽ cư chúng trong R. Đây là mã:
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)
Nếu tôi cố gắng để có được các giá trị, các thành phần thời gian bị tước ra của dữ liệu kết quả
res <- dbGetQuery(con, "SELECT * FROM test_table")
res[1:20,1]
Lớp của kết quả, tuy nhiên, là POSIXct
class(res[,1])
Nếu kết quả là lấy một bản ghi tại một thời điểm, các giá trị với giờ: phút bằng 0:00 mất các thành phần thời gian:
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
Như một giải pháp thay thế, tôi đang tìm nạp bản ghi kết quả 1 tại một thời điểm, sửa và gộp chúng vào một tệp dữ liệu. Nhưng điều này rất tốn thời gian, đặc biệt là đối với các tập dữ liệu lớn. Bất kỳ ý tưởng nào về lý do tại sao điều này xảy ra và cách giải quyết vấn đề này?
Cảm ơn trước!
Như đã đề cập ở trên, sử dụng 'dấu thời gian với múi giờ ' trong câu lệnh' CREATE TABLE' đã thực hiện thủ thuật cho tôi.Mặc dù nó không thực sự là một phần của câu hỏi, theo kinh nghiệm của tôi, tôi đã thấy rằng 'dbWriteTable' không thích ** bất kỳ chữ cái viết hoa nào khi chỉ rõ tên bảng SQL cần ghi vào. – bibzzzz