【问题标题】:How can I print a non UTC timestamp using datatable (DT package) in Rmarkdown?如何在 Rmarkdown 中使用数据表(DT 包)打印非 UTC 时间戳?
【发布时间】:2017-10-31 23:40:24
【问题描述】:

我有一些时间戳存储在不同的时区,我想将这些时间戳包含在使用 DT 包在 rmarkdown 文档中的数据表中。

我想在存储的时区中显示时间戳,但由于某种原因datatable 将其转换为 UTC。我使用print 时的行为是我想要的,但格式不好。

如何使用datatableprint 实现相同的行为?

这是rmarkdown 文件的最小工作示例:

---
title: "MinorQ"
output: html_document
---

```{r setup}
library(DT)
df=data.frame(timestamp=as.POSIXct("2017-01-01 12:34:56",tz="CET"))
df$tzone=attr(df$timestamp,"tzone")
datatable(df)
print(df)
```

【问题讨论】:

  • 这是因为从 R 到 JS 的类型转换。你可以只存储字符串:timestamp = format(as.POSIXct("2017-01-01 12:34:56", tz = "CET"), format = '%F %T %Z')
  • 是的,我相信我也可以使用 as.character。当我问起时,我正在考虑一个更复杂的案例,其中包含数据中的几个时区。但是,我认为不会出现这种情况,所以我会按照您的解决方案进行。

标签: r r-markdown dt


【解决方案1】:

正如我在评论中提到的,您可以将您的 POSIXct 元素转换为字符:

input <- format(as.POSIXct("2017-01-01 12:34:56", tz = "CET"), format = '%F %T %Z')
str(input)

# chr "2017-01-01 12:34:56 CET"

这并不意味着您不能使用不同的时区。从表格中读取时,您可以使用 gsub 获取正确时区的日期:

# First gsub: remove all capital letters (so only date and time remain)
# Sec.  gsub: remove all characters exept capital letters (so only CET, UTC, etc. remain).

out <- as.POSIXct(gsub(input, pattern = "[A-Z]", replacement = ""), 
                  format = '%F %T', 
                  tz     = gsub(input, pattern = "[^A-Z]", replacement = ""))

str(out)
# POSIXct[1:1], format: "2017-01-01 12:34:56"

lubridate::tz(out)
# [1] "CET"

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2017-02-05
    • 2018-08-04
    相关资源
    最近更新 更多