2013-10-04 19 views
22

Khi bảng excel được nhập dưới dạng các điểm xy trong ArcGIS, tôi tiếp tục mất dấu DateTime chính xác cho mỗi điểm. Vì vậy, tôi đã định dạng số sê-ri DateTime, đã tạo tệp .shp và đọc tệp .shp vào R bằng cách sử dụng readOGR().Chuyển đổi số sê-ri DateTime excel thành R DateTime

Khi ở trong R tôi có thể chuyển đổi sang ngày chính xác bằng cách sử dụng as.Date() và đối số origin = "1899-12-30" nhưng thời gian bị bỏ qua. Trong khi tôi đã nhìn thấy các ví dụ với một ngày duy nhất, tôi đã không nhìn thấy ví dụ làm việc với DateTime. Tôi đã sử dụng as.Date() cũng như as.POSIXct() nhưng nhiệm vụ dường như đơn giản này là một chút bực bội, do đó, bài đăng ...

Tôi đã tạo một tập dữ liệu mẫu với 10 hàng định dạng DateTime chính xác cũng như số seri excel .

* Cảm ơn Richard và thelatemail vì con mắt quan tâm của họ về một trở ngại trước đó. Tôi đã sửa dữ liệu và đăng lại ở đây.

Đây là dữ liệu mẫu của tôi

helpData <- structure(list(ID = 1:10, DateTime = structure(c(9L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 8L), .Label = c("3/11/2011 7:55", "3/13/2011 7:55", 
"3/14/2011 0:00", "3/14/2011 10:04", "3/14/2011 7:55", "3/15/2011 19:55", 
"3/17/2011 7:55", "3/18/2011 4:04", "3/4/2011 6:00"), class = "factor"), 
ExcelNum = c(40606.25, 40613.32986, 40615.32986, 40616, 40616.41944, 
40616.32986, 40617.82986, 40619.32986, 40620.16944, 40620.16944 
)), .Names = c("ID", "DateTime", "ExcelNum"), class = "data.frame", row.names = c(NA, 
-10L)) 

head(helpData) 

Các DateTime là GMT. Thời gian là một đồng hồ 24 giờ (tức là không phải là AM/PM). Tôi đang làm việc trên Windows 7, có R mới nhất và ArcGIS 10.

Mã bên dưới có ngày chính xác nhưng thời gian vẫn bị thiếu.

newDateTime <- as.Date(helpData[ , "ExcelNum"], origin = "1899-12-30") 
head(newDateTime) 

Cảm ơn bạn trước!

+1

Bạn có thể có một cái nhìn tại chủ đề tương tự [ở đây] (http://stackoverflow.com/questions/4868693/convert-fraction -of-day-to-posix-times-in-r) và [ở đây] (http://stackoverflow.com/questions/12161984/how-to-elegantly-convert-datetime-from-decimal-to-dmy- hms /). – Henrik

Trả lời

34

Số của bạn đang tính ngày. Chuyển đổi sang giây, và bạn đã cài đặt xong (ít hơn một lỗi làm tròn)

helpData[["ExcelDate"]] <- 
    as.POSIXct(helpData[["ExcelNum"]] * (60*60*24) 
    , origin="1899-12-30" 
    , tz="GMT") 


#  ID  DateTime ExcelNum   ExcelDate 
# 1 1 3/4/2011 6:00 40606.25 2011-03-04 06:00:00 
# 2 2 3/11/2011 7:55 40613.33 2011-03-11 07:54:59 
# 3 3 3/13/2011 7:55 40615.33 2011-03-13 07:54:59 
# 4 4 3/14/2011 0:00 40616.00 2011-03-14 00:00:00 
# 5 5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59 
# 6 6 3/14/2011 7:55 40616.33 2011-03-14 07:54:59 
# 7 7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59 
# 8 8 3/17/2011 7:55 40619.33 2011-03-17 07:54:59 
# 9 9 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
# 10 10 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
+0

Cảm ơn Ricardo Saporta và thông báo cho các đề xuất thông tin –

9

Các dữ liệu thời gian được vẫn còn đó, nó chỉ không được hiển thị - xem:

as.numeric(newDateTime) 
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc 

Nếu bạn đang có nhu cầu làm việc với các phần của ngày, bạn có lẽ tốt nhất bằng cách sử dụng các biểu diễn POSIXct. Để làm như vậy, bạn có thể chuyển đổi thành Date, sau đó chuyển đổi thành POSIXct, mặc dù điều này mang lại các vấn đề múi giờ phát nếu bạn muốn so sánh trực tiếp với cột DateTime của mình.

helpData$newDate <- as.POSIXct(as.Date(helpData$ExcelNum,origin="1899-12-30")) 
attr(helpData$newDate,"tzone") <- "UTC" 
helpData 

# ID  DateTime ExcelNum    newDate 
#1 1 3/4/2011 6:00 40606.25 2011-03-04 06:00:00 
#2 2 3/11/2011 7:55 40613.33 2011-03-11 07:54:59 
#3 3 3/13/2011 7:55 40615.33 2011-03-13 07:54:59 
#4 4 3/14/2011 0:00 40616.00 2011-03-14 00:00:00 
#5 5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59 
#6 6 3/14/2011 7:55 40616.33 2011-03-14 07:54:59 
#7 7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59 
#8 8 3/17/2011 7:55 40619.33 2011-03-17 07:54:59 
#9 9 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
#10 10 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
2

Sử dụng hàm ConvertToDateTime. Nó thẳng về phía trước. Dưới đây là một ví dụ:

convertToDateTime (helpData $ ExcelNum, origin = "1900-01-01")

Hãy cho tôi biết thế nào nó hoạt động.

2

Đây là một cách khác để làm điều đó bằng gác cổng và tibble gói:

install.packages("janitor") 

install.packages("tibble") 

library(tibble) 

library(janitor) 

excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern") 
Các vấn đề liên quan