【问题标题】:as.POSIXct with datetimes including midnightas.POSIXct 日期时间包括午夜
【发布时间】:2013-11-03 19:02:05
【问题描述】:

我想将存储为字符的日期时间转换为日期时间对象。 但是,如果日期时间包括午夜,则生成的日期时间对象不包括时间组件,然后在稍后的函数中使用时会引发错误(此处不需要 - 但一个用于提取指定位置和日期时间的天气数据的函数)。

示例代码:

example.dates <- c("2011-11-02 00:31:00","2011-11-02 00:00:00","2011-11-02 00:20:22")
posix.dates   <- as.POSIXct(example.dates, tz="GMT", format="%Y-%m-%d %H:%M:%S")
posix.dates
posix.dates[2]

仅当包含午夜的日期时间被单独调用(原子向量)时,才排除 NB 次。

有没有办法保留午夜时间的时间数据?你能推荐一个替代功能吗?

【问题讨论】:

  • 时间信息有,只是没有显示。我有点惊讶这会导致稍后出现错误。也许问题出在您以后的功能上。你能告诉我们那个代码吗? (作为可用的证明,请参阅format(posix.dates, '%Y-%m-%d %M:%H')
  • 谢谢@Thilo。我想在 R 包“RNCEP”中使用函数“NCEP.interp”。查看该函数的源代码,错误来自以下代码行,它返回 NA:strptime(posix.dates[2], "%Y-%m-%d %H:%M:%S" ,'UTC') 考虑到我已经在使用 datetime 对象,这不应该是必要的,但这就是函数的编写方式。
  • 我担心你的错误在其他地方。如果我运行strptime(posix.dates, "%Y-%m-%d %H:%M:%S",'UTC'),结果很好并且符合预期。实际的错误信息是什么?
  • 如果你在单个值上运行它,而不是整个向量:strptime(posix.dates[2], "%Y-%m-%d %H:%M:%S" ,'UTC') 没有错误信息,但是返回'NA',在后面的函数中使用会报错。
  • 我建议不要在 POSIXct 值上使用 strptime。如果要转换为POSIXltas.POSIXlt 更好。如果你想使用strptime,那么先自己转换成characterstrptime(format(posix.dates[2], "%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S", "UTC")

标签: r datetime posixct


【解决方案1】:

好的,过一段时间我可以再次确认您的问题。

对我来说,这看起来像是 R 中的一个错误。我建议您在 https://bugs.r-project.org/bugzilla3/ 上报告它。

作为临时解决方法,您可以尝试这样覆盖strptime 函数是否有帮助:

strptime <- function (x, format, tz = "") 
{
    if ("POSIXct" %in% class(x)) {
        x
    } else {
        y <- .Internal(strptime(as.character(x), format, tz))
        names(y$year) <- names(x)
        y
    }
}

【讨论】:

  • 感谢蒂洛和@GSee。我无法重写 strptime 或避免使用它,除非我进入调用该函数的包“RNCEP”——即我必须重写包源并重新编译。对于这种特定情况,运行“NCEP.interp”函数,我想到的唯一简单的解决方法是不首先转换字符日期时间,而是让包使用 strptime 来转换——这似乎可行。
【解决方案2】:

我更喜欢将lubridate 包用于日期时间。它似乎也不会在这里引起问题:

example.dates <- c("2011-11-02 00:31:00","2011-11-02 00:00:00","2011-11-02 00:20:22")
library(lubridate)
ymd_hms(example.dates)

【讨论】:

  • 谢谢,但不幸的是,这给出了同样的问题(参见上面添加的两行代码)。
【解决方案3】:

lubridate::as_datetime() 更灵活,接受日期(解释为 00:00:00)和日期时间。

example.dates <- c("2011-11-02", "2011-11-02 00:31:00","2011-11-02 00:00:00","2011-11-02 00:20:22")
library(lubridate)

ymd_hms(example.dates)
#> Warning: 1 failed to parse.
#> [1] NA                        "2011-11-02 00:31:00 UTC"
#> [3] "2011-11-02 00:00:00 UTC" "2011-11-02 00:20:22 UTC"

as_datetime(example.dates)
#> [1] "2011-11-02 00:00:00 UTC" "2011-11-02 00:31:00 UTC"
#> [3] "2011-11-02 00:00:00 UTC" "2011-11-02 00:20:22 UTC"

【讨论】:

    【解决方案4】:

    现在意识到这是一个老问题,但我遇到了同样的问题并找到了这个解决方案:

    https://stackoverflow.com/a/51195062/8158951

    基本上,您需要做的就是应用如下格式。 OP 的代码需要在 POSIXct 函数调用之后包含格式化调用。

    posix.dates <- format(as.POSIXct(example.dates, tz="GMT"), format="%Y-%m-%d %H:%M:%S")
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2018-12-14
      • 2012-01-11
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 2012-08-13
      • 2021-06-06
      相关资源
      最近更新 更多