如何使用dplyr和RPostgreSQL将字符日期时间转换为可用?

时间:2016-01-25 17:36:22

标签: r postgresql datetime dplyr amazon-redshift

我的数据中有时间戳,列Timelocal,其格式如下:

2015-08-24T00:02:03.000Z

通常,我使用以下行转换此格式以将其转换为我可以使用的日期格式。

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")

这在我的机器上工作正常。问题是,我现在正在使用更大的数据帧。它位于Redshift集群上,我使用RPostgreSQL包访问它。我正在使用dplyr来操作数据,因为在线文档表明它与RPostgreSQL很好地配合。

似乎确实如此,除了转换日期格式。我想将字符格式转换为时间格式。 Timelocal将其作为“varchar”读入Redshift。因此,R将其解释为字符字段。

我尝试了以下内容:

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

尝试1 - 使用简单的dplyr语法

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

尝试2 - 使用其他在线参考代码中的dplyr语法

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

尝试3 - 使用strptime代替fast_strptime

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

我正在尝试从此处调整代码:http://www.markhneedham.com/blog/2014/12/08/r-dplyr-mutate-with-strptime-incompatible-sizewrong-result-size/

我的尝试错误,因为:

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 

似乎strptime与RPostgreSQL不兼容。这是正确的解释吗?如果是这样,这是否意味着如果数据在Redshift上,则无法处理R中的日期格式?我检查了RPostgreSQL包文档,但没有看到任何与指定时间格式相关的内容。

非常感谢有关使用dplyr和RpostgreSQL正确格式化日期时间列的任何建议。

2 个答案:

答案 0 :(得分:1)

传统的R功能在这里不起作用。
您应该使用最新版本的dplyrdbplyr中不断发展的SQL翻译 以下对我有用:

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

注意,我使用的是AWS Redshift。

答案 1 :(得分:0)

以下是否有效?

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