【问题标题】:In R lubridate package, hour function returns wrong hour在 R lubridate 包中,小时函数返回错误的小时
【发布时间】:2025-11-27 18:25:01
【问题描述】:

我有一个 POSIXct 时间对象,我想从中提取小时。但是返回了错误的时间。我的输出如下。

> t
[1] "2018-04-09 09:05:25 CEST"
> class(t)
[1] "POSIXct"
> hour(t)
[1] 7

谁知道如何解决这个问题?提前致谢!

乔迪

【问题讨论】:

  • 对我来说无法重现...lubridate::hour(as.POSIXct("2018-04-09 09:05:25 CEST")) 返回 9。
  • 可能定义了两个不同的系统时间/时区?一个在 R 中,一个在操作系统中,而 R 正在某个地方进行转换?
  • 我也无法重现这个。也许添加您如何制作 POSIXct 时间对象?
  • 除了lubridate 之外,是否可以加载另一个具有hour 函数的包?

标签: r lubridate hour


【解决方案1】:

我发现lubridateymd()ymd_hms()(以及ydm() 等其他组合)非常方便:

library(lubridate)
t <- ymd_hms("2018-04-09 09:05:25 CEST")
hour(t) 
# [1] 9

【讨论】:

    【解决方案2】:

    感谢大家的帮助。

    我找到了解决方案,由this answer on * 提出。

    和你一样,我无法在孤立的环境中重现答案。但是,由于我的“t”值来自 DataFrame,隐式类型转换似乎导致该值的存储方式与隔离环境中不同。

    为了比较,在我孤立的环境中,我会得到以下结果,

    > t = as.POSIXct("2018-04-09 09:05:25")
    > t
    [1] "2018-04-09 09:05:25 CEST"
    > as.character(t)
    [1] "2018-04-09 09:05:25"
    

    而在我自己的代码中,我会得到来自 DataFrame 的 t

    > t = tb[i, "time"]
    > t
    [1] "2018-04-09 09:05:25 CEST"
    > as.character(t)
    [1] "1523257525"
    

    换句话说,内部有些东西是不同的 - 顺便说一句,我仍然无法掌握。

    但是,它可以通过以下方式进行“修复”:

    t = as.POSIXct(as.numeric(t), origin="1970-01-01")
    

    【讨论】: