【问题标题】:Shiny/DT: column & top filter for datetime column show wrong valuesShiny/DT:日期时间列的列和顶部过滤器显示错误值
【发布时间】:2017-08-23 23:12:37
【问题描述】:

我很难弄清楚为什么我的 column and filter for datetime 列显示了错误的日期和时间。

我的数据看起来像这样(dput在下面的闪亮代码中):

                 DATUM NUMMER
1  2017-03-29 00:00:02     19
2  2017-03-29 00:00:36     20
3  2017-03-29 00:00:40     21
4  2017-03-29 00:00:44     22
5  2017-03-29 00:00:47     23
6  2017-03-29 00:00:51     24
7  2017-03-29 00:00:55     25
8  2017-03-29 00:00:59     26
9  2017-03-29 00:01:03     27
10 2017-03-29 00:01:07     28

正如我们所见,这没什么特别的。使用 DT 包以闪亮的方式显示此数据后,数据如下所示:

显示有2h的差异,没有任何理由...

我的第一种方法是检查我的Sys.time()

> Sys.time()
[1] "2017-03-30 09:09:40 CEST"

这是正确的,第二种方法是深入研究DT 文档,我在那里找到了函数:formatDate(1, method = 'toLocaleString')。我用过,日期时间字段的显示看起来不错(见下图),但是顶部过滤器仍然显示错误的日期时间值...

这是可重现的示例:

library(shiny)
library(DT)

data <- structure(list(DATUM = structure(c(1490738402, 1490738436, 1490738440, 
                                           1490738444, 1490738447, 1490738451, 1490738455, 1490738459, 1490738463, 
                                           1490738467), class = c("POSIXct", "POSIXt"), tzone = "CEST"), NUMMER = c(19, 
                                                                                                                20, 21, 22, 23, 24, 25, 26, 27, 28)), .Names = c("DATUM", "NUMMER"
                                                                                                                ), row.names = c(NA, 10L), class = "data.frame")

ui= fluidPage(

      dataTableOutput("tab")
    )

server= function(input, output,session) {

  output$tab <- DT::renderDataTable({
    datatable(data,rownames=TRUE, filter="top", class = 'cell-border stripe') %>%
      formatDate(1, method = 'toLocaleString')})


}

shinyApp(ui, server)

正如我们在数据中看到的,min 日期时间值是 2017-03-29 00:00:02,但是 datatable 的顶部过滤器显示 2017-03-28T22:00:02,而数据中的 max 日期时间值是:2017-03-29 00:01:07,顶部过滤器显示:2017-03-28T22:01:07

我将不胜感激任何帮助和解释,为什么 DT 包会转换我的数据并以 2 小时的差异显示它,以及为什么在暗示函数 formatDate() 后,过滤器仍然显示错误的值。

感谢您的帮助

【问题讨论】:

  • 我试过了,日期时间列的显示没有任何变化
  • @HubertL 我不太明白你的意思是什么
  • 试试tzone = "CET"
  • 我认为这里唯一的问题是 as.POSIXct(Sys.Date()) 产生两个小时的差异(凌晨 2 点而不是 12 点),使用 as.POSIXct(Sys.Date(), tz = "CET") 对我也不起作用:-/

标签: r datetime shiny dt


【解决方案1】:

noUISlider 的代码是here。在获取滑块的最小值和最大值时,似乎所有日期都被视为 UTC。

您可以将日期和时间转换为 UTC 时区中的相同日期和时间,以使滑块与您的日期保持一致:

data$DATUM <- as.POSIXct(as.character(data$DATUM), tz="UTC")

ui=fluidPage(

  dataTableOutput("tab")
)

server= function(input, output,session) {

  output$tab <- DT::renderDataTable({
    datatable(data,rownames=TRUE, filter="top", class = 'cell-border stripe') %>%
      formatDate(1, method = 'toISOString')})


}

shinyApp(ui, server)

当滑块移动时,R 控制台中会出现警告,指出时区不一致,但过滤有效。

【讨论】:

  • 太棒了!谢谢!终于成功了,这真是一个令人头疼的问题
猜你喜欢
  • 2020-03-02
  • 2019-05-08
  • 2013-08-23
  • 2015-08-28
  • 2019-07-17
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多