2017-12-22 91 views
7

Khi tôi cố gắng thực hiện đoạn mã sau vào RStudioR và Rscript cho kết quả khác nhau cho datetime

library(lubridate) 
library(data.table) 

a <- data.frame(c("2017-12-01 00:01:00","2017-12-02 00:01:00"),c(5,6)) 
colnames(a) <- c("t", "x") 
a <- as.data.table(a) 
a[, t := parse_date_time(t, orders = "ymd HMS")] 
print(class(a$t)) 
paste("a:", format(a[1,1], format = "%Y-%m-%d %H:%M:%S")) 

Tôi có kết quả sau:

[1] "a: 2017-12-01 00:01:00" 

Nhưng khi tôi cố gắng chạy cùng mã dưới Rscript, đầu ra là

[1] "a: 1" 

Có ai có cùng vấn đề với tôi không? Bất kỳ trợ giúp được đánh giá cao.

EDIT: Phiên bản R 3.3.1, nền tảng x86_64-w64-mingw32/x64.

Windows Server 2012 phiên bản:

Major Tiểu Xây dựng sửa đổi

+2

Đối với tôi, cả hai đều cho cùng một đầu ra. – suchait

+0

xóa/xóa môi trường của bạn nếu bạn có thể và chạy lại đoạn văn bản – Onyambu

+0

Tôi đã thực hiện nó, sự cố vẫn tiếp tục. Tôi nghĩ rằng tôi sẽ thêm chi tiết hơn, chẳng hạn như chạy nó từ cửa sổ máy chủ –

Trả lời

2

Vấn đề thực sự là với data.table. Trong các phiên bản trước đó của data.table, nếu chúng ta sử dụng chỉ mục số, không có with=FALSE, thì nó sẽ trả về chỉ mục số. Do đó đầu ra, được chia sẻ trong câu hỏi. Để biết chi tiết về điều này, người ta có thể xem qua tài liệu của data.table.

Trong các phiên bản gần đây của data.table, tuy nhiên, sự cố này đã được giải quyết và kết quả là data.table hoạt động khá giống như data.frame. Đây là lý do, tại sao không ai có thể tái tạo đầu ra được chia sẻ trong câu hỏi.

Dưới đây là mã được cập nhật, sử dụng tùy chọn with=FALSE với dữ liệu.table.

library(lubridate) 
library(data.table) 

a <- data.frame(c("2017-12-01 00:01:00","2017-12-02 00:01:00"),c(5,6), stringsAsFactors=FALSE) # stringsAsFactors=TRUE 
colnames(a) <- c("t", "x") 
a$t1 <- parse_date_time(a$t, orders = "ymd HMS") 
a <- as.data.table(a) 
a[, t := parse_date_time(as.character(t), orders = "ymd HMS")] 
print(class(a$t)) 
paste("a:", format(a[1,1, with=FALSE], format = "%Y-%m-%d %H:%M:%S")) 

Bạn có thể nhận thông tin về phiên bản gói sử dụng bằng cách sử dụng sessionInfo(). Sử dụng các phiên bản gói, vấn đề có thể được xác định.

+0

Sự cố vẫn tiếp diễn. Phiên bản 'data.table' và' lubridate' mà tôi đang sử dụng là 'data.table_1.9.6 lubridate_1.6.0' –

+1

Suy nghĩ thứ hai, vấn đề có thể xảy ra với data.table. Do đó thêm với = FALSE trong data.table. Hy vọng điều này giải quyết vấn đề của bạn. Xem liên kết https://stackoverflow.com/questions/13383840/select-multiple-columns-in-data-table-by-their-numeric-indices. –

+0

Sử dụng 'with = FALSE' hoạt động như một sự quyến rũ! Cảm ơn nhiều. Vui lòng cập nhật câu trả lời của bạn. –

Các vấn đề liên quan