如何在 R 中使用 implyr 格式化日期?
Posted
技术标签:
【中文标题】如何在 R 中使用 implyr 格式化日期?【英文标题】:How to format dates using implyr in R? 【发布时间】:2018-04-05 19:40:42 【问题描述】:我在 R 中使用 implyr
包从 HDFS/Impala 收集数据。在收集 R 中的数据之前,我想将当前在 Impala 中格式化为时间戳的字段格式化为 YYYYMM。这是我的代码:
library(implyr); library(dplyr)
data %>%
select(date_field) %>%
mutate(yyyymm = as.Date(date_field, format = '%Y%m'))
注意:我需要在之前从 Impala 收集此文件。
使用show_query()
函数,我收到以下信息:
SELECT AS.DATE(date_field, '%Y%m' as "format") as yyyymm
FROM data
Warning message:
Named arguments ignored for SQL AS.DATE
由于 implyr
是 Impala 的 dplyr
的后端,我的问题是 - 有谁知道是否存在代码可以相应地格式化日期和转换为可识别的 Impala询问?在我看来,转换并不成功(回复:AS.DATE(date_field, '%Y%m' as "format") as yyyymm
)。我真的希望这个问题可以通过dplyr
语法解决?
我查看了作者的文档https://github.com/ianmcook/implyr 并通过堆栈上的问题,但无法弄清楚。
提前致谢。
编辑:
我能够做到这一点:library(implyr); library(dplyr)
data %>%
select(date_field) %>%
mutate(yyyy = year(date_field), mm = month(date_field))
产生:
Date_Field yyyy mm 2015-04-13 19:33:26.000 2015 4但是,如果我添加 %>% mutate(yyyymm = paste0(yyyy,mm))
,则错误在 Impala 查询 errorMessage:AnalysisException: No matching function with signature: concat(INT, INT)
中。所以我需要做的是在连接它们之前将yyyy
和mm
对象转换为字符串,以便Impala 识别它。在 Impala 中,它看起来像这样:
select date_field
, concat(cast(year(date_field) as string), cast(month(date_field) as string)) as yyyymm
from data
给我我想要的东西:
Date_Field yyyymm 2015-04-13 19:33:26 20154除了月份格式的小例外,它应该可以在 Impala 中用 lpad
之类的东西来修复,但出于我的目的,我并不关心这个。所以我需要弄清楚的是,在执行paste0
函数之前,如何将我的dplyr
R 代码中的yyyy
和mm
字段适当地转换为字符串。
【问题讨论】:
所以你需要把201804
这样的日期格式化成什么?
感谢您如此迅速地回复。我需要在管道时将2018-04-05 16:32:35
格式化为201804
,以便我可以按新的 YYYYMM 日期字段进行分组。由于 implyr
正在将其转换为 Impala 中的查询,因此我不确定适当的 dplyr
代码将用于执行此格式化。
ping 作者@ianmcook :) 如果没有回应,我建议在 GitHub 上提交一个带有此帖子链接的问题。
【参考方案1】:
在 as.Date() 函数中,您应该传递给参数的格式是数据所在的格式,而不是您希望转换的格式。
使用包 lubridate,我重现了您的问题,这对我有用:
library(lubridate)
paste0(year(as.Date(date_field, "%Y-%m-%d")), month(as.Date(date_field, "%Y-%m-%d")))
你只需要在你的 mutate 调用中传递这个。
【讨论】:
感谢您的回复,但是,这似乎无法解决我的问题。执行data %>% select(date_field) %>% mutate(yyyymm = paste0(year(as.Date(date_field, "%Y-%m-%d")), month(as.Date(date_field, "%Y-%m-%d")))) %>% select(yyyymm)
显示指向concat(YEAR(AS.DATE(
date_field, '%Y-%...
的语法错误,不幸的是,这与之前发生的情况相似。
请在上面的问题中查看我的编辑。 @GiovanaStein
在最后一次编辑之后,我的解决方案非常简单 - 请参阅下面的答案【参考方案2】:
我想通了。自从我上次编辑我的问题以来,修复只需要添加以下内容:
mutate(yyyy = as.character(yyyy), mm = as.character(mm)) %>%
mutate(yyyymm = paste0(yyyy,mm))
所以完整的解决方案是:
library(implyr); library(dplyr)
data %>%
select(date_field) %>%
mutate(yyyy = year(date_field), mm = month(date_field)) %>%
mutate(yyyy = as.character(yyyy), mm = as.character(mm)) %>%
mutate(yyyymm = paste0(yyyy,mm))
问题是我需要逐步执行此操作,以便 Impala 将其识别为可执行查询。
【讨论】:
以上是关于如何在 R 中使用 implyr 格式化日期?的主要内容,如果未能解决你的问题,请参考以下文章