如何在 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) 中。所以我需要做的是在连接它们之前将yyyymm 对象转换为字符串,以便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 代码中的yyyymm 字段适当地转换为字符串。

【问题讨论】:

所以你需要把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 格式化日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 r 汽车包中的后续情节的完整性中以适当的格式在 x 轴上绘制日期?

如何在 Dart 中格式化日期? [复制]

在R中将日期转换为特定格式的字符

在 R 中格式化具有不一致日期格式的向量

在 R 中更改日期格式

如何在 .Net / C# 中将日期转换为 HTTP 格式的日期