我的数据中有时间戳,列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正确格式化日期时间列的任何建议。
答案 0 :(得分:1)
传统的R功能在这里不起作用。
您应该使用最新版本的dplyr
和dbplyr
中不断发展的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")