2016-01-25 35 views
7

Tôi có tem thời gian, cột Timelocal trong dữ liệu của tôi đó là định dạng như sau:Làm thế nào để chuyển đổi thời gian ngày của ký tự thành sử dụng được bằng dplyr và RPostgreSQL?

2015-08-24T00:02:03.000Z 

Thông thường, tôi sử dụng các dòng sau để chuyển đổi định dạng này để chuyển nó sang một định dạng ngày tôi có thể sử dụng.

timestamp2 = "2015-08-24T00:02:03.000Z" 
timestamp2_formatted = strptime(timestamp2,"%Y-%m-%dT%H:%M:%S",tz="UTC") 
    # also works for dataframes (my main use of it) 
     df$TimeNew = strptime(df$TimeLocal,"%Y-%m-%dT%H:%M:%S",tz="UTC") 

Điều này hoạt động tốt trên máy tính của tôi. Vấn đề là, bây giờ tôi đang làm việc với một khung dữ liệu lớn hơn nhiều. Đó là trên một cụm Redshift và tôi đang truy cập nó bằng gói RPostgreSQL. Tôi đang sử dụng dplyr để thao tác dữ liệu vì tài liệu trực tuyến chỉ ra rằng nó chơi độc đáo với RPostgreSQL.

Dường như, ngoại trừ việc chuyển đổi định dạng ngày. Tôi muốn chuyển đổi định dạng ký tự thành định dạng thời gian. Timelocal nó được đọc vào Redshift là "varchar". Do đó, R giải thích nó như một trường ký tự.

Tôi đã thử những điều sau đây:

library(dplyr) 
library(RPostgreSQL) 
library(lubridate) 

thử 1 - sử dụng cú pháp dplyr dễ

mutate(elevate, timelocalnew = fast_strptime(timelocal, "%Y-%m-%dT%H:%M:%S",tz="UTC")) 

thử 2 - sử dụng dplyr cú pháp từ một mã tham khảo trực tuyến

elevate %>% 
    mutate(timelocalnew = timelocal %>% fast_strptime("%Y-%m-%dT%H:%M:%S",tz="UTC") %>% as.character()) %>% 
    filter(!is.na(timelocalnew)) 

thử 3 - sử dụng strptime thay vì fast_strptime

elevate %>% 
    mutate(timelocalnew = timelocal %>% strptime("%Y-%m-%dT%H:%M:%S",tz="UTC") %>% as.character()) %>% 
    filter(!is.na(timelocalnew)) 

Tôi cố gắng để thích ứng với mã từ đây: http://www.markhneedham.com/blog/2014/12/08/r-dplyr-mutate-with-strptime-incompatible-sizewrong-result-size/

cố gắng của tôi được erroring vì:

Error in postgresqlExecStatement(conn, statement, ...) : 
    RS-DBI driver: (could not Retrieve the result : ERROR: syntax error at or near "AS" 
LINE 1: ...CAST(STRPTIME("timelocal", '%YSuccess2048568264T%H%M�����', 'UTC' AS "tz") A... 
                  ^
) 
In addition: Warning messages: 
1: In postgresqlQuickSQL(conn, statement, ...) : 
    Could not create executeSELECT count(*) FROM (SELECT "timelocal", "timeutc", "zipcode", "otherdata", "country", CAST(STRPTIME("timelocal", '%Y%m%dT%H%M%S', 'UTC' AS "tz") AS TEXT) AS "timelocalnew" 
FROM "data") AS "master" 
2: Named arguments ignored for SQL STRPTIME 

Có vẻ như strptime rằng không tương thích với RPostgreSQL. Đây có phải là giải thích đúng không? Nếu vậy, điều này có nghĩa là không có phương tiện xử lý các định dạng ngày tháng trong R nếu dữ liệu đang trên Redshift? Tôi đã kiểm tra tài liệu gói RPostgreSQL và không thấy bất cứ điều gì liên quan đến việc xác định định dạng thời gian.

Sẽ đánh giá cao bất kỳ lời khuyên nào về việc nhận các cột ngày giờ được định dạng chính xác với dplyr và RpostgreSQL.

Trả lời

0

Công việc sau có hoạt động không?

as.Date(strptime(timelocal,format = "%YYYY/%MM/%DD %H:%M:%OS"),tz="UTC") 
0

Chức năng R truyền thống sẽ không hoạt động tại đây.
Bạn nên đi với bản dịch SQL đã được phát triển trong các phiên bản mới nhất của dplyrdbplyr.
Sau đây làm việc cho tôi:

library(dbplyr) 
mutate(date = to_date(timestamp2, 'YYYY-MM-DD')) 

Note, tôi đang sử dụng AWS chuyển đỏ.

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