【问题标题】:Format date in Datatable output在数据表输出中格式化日期
【发布时间】:2017-11-02 09:12:46
【问题描述】:
library(DT)
seq_dates <- data.frame(dates = as.Date("2017-01-01") + 1:6 * 100)
datatable(seq_dates) %>% formatDate(1, "toDateString")

我在查看器窗格中获得了一个数据表,以“2017 年 5 月 22 日星期一”的格式显示日期。

Q - 如何将日期列格式化为“MM-YY”

如果我这样做,

dplyr::mutate(seq_dates, dates = format(dates, format = "%b-%Y")) %>%
  datatable()

我得到了所需的日期格式,但在第二种情况下,列排序不起作用(排序是按字母而不是日期完成的。)

P.S - 我正在 Shiny 上实现这个。

【问题讨论】:

    标签: r sorting shiny dt


    【解决方案1】:

    有一个可以使用的渲染方法:

    datatable( ...
      options = list(..
         columnDefs = list(..
            list(targets = c(1), render = JS(
                                 "function(data, type, row, meta) {",                              
                                  "return type === 'display' ? new Date(data).toLocaleString() : data;"))))
                            
    

    【讨论】:

      【解决方案2】:

      对于它的价值(并使用formatDate),我能做的最好的事情如下:

      datatable(seq_dates) %>% 
        formatDate(
          columns = 1, 
          method =  "toLocaleDateString", 
          params = list(
            'en-US', 
            list(
              year = 'numeric', 
              month = 'numeric')
            )
          )
      

      这会产生像4/201710/2017 这样的日期值。

      我试图找到这些参数选项(在 github 和原始数据表文档中)但无济于事。 DT中唯一的例子使用了shortlongnumeric的参数。

      【讨论】:

      • params 指的是 JavaScript 方法采用的参数,在本例中是 toLocaleDateString 的参数。 toLocalDateString 的参数可以在MDNIntl.DateTimeFormat 的文档中找到。
      【解决方案3】:

      您好,在这些情况下,我认为最好的解决方案是添加一个带有原始格式日期的虚拟列,并根据 DUMMY 列中的值对日期列进行排序。这在 Datatable 中很容易做到。示例代码如下。

      seq_dates <- data.frame(dates = as.Date("2017-01-01") + 1:6 * 100)
      datatable(seq_dates %>% mutate(DUMMY = dates,dates = format(dates, format = "%b-%Y")),
                options = list(
                  columnDefs = list(
                    list(targets = 1,orderData = 2),
                    list(targets = 2, visible = FALSE)
                   )
                 ))
      

      【讨论】:

      • 不错的解决方法。我希望有formatDate() 的解决方案。如果几天后没有更直接的解决方案,我会验证你的。
      • 由于我 (OP) 需要 MM-YY 格式,因此我将日期 col 转换为具有适当级别的因子 - 成功了!
      • @Vasim 很酷,您找到了自己的解决方案,但由于我的解决方案允许各种日期格式,所以我认为您没有必要否决答案。
      • @Vasim 我的意思是得到你想要的,只需更改为format = "%m-%y"
      • 到今天为止,列枚举从 0 开始。
      【解决方案4】:

      "%b-%y" "dates" 转换为日期格式并不是一件容易的事,正如我所见...

      如果您不太喜欢显示"%b-%y" 格式,简单的方法是使用"%Y-%m""%y-%m" 格式,过滤器就可以正常工作:

      library(DT)
      
      seq_dates <- as.data.frame(seq(Sys.Date() - 100, Sys.Date(), by = "m"))
      seq_dates <- format(seq_dates, format = "%y-%m")
      
      datatable(seq_dates)
      
      #resulting in
      
      #1        2017-02
      #2        2017-03
      #3        2017-04
      #4        2017-05
      
      #or
      
      #1        17-02
      #2        17-03
      #3        17-04
      #4        17-05
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        • 2021-09-19
        相关资源
        最近更新 更多