【问题标题】:formatting time in R errorR错误中的格式化时间
【发布时间】:2018-06-26 23:20:22
【问题描述】:

我的df 中有一个Time 列,其值为1.01.2016 0:00:05。我想要它没有秒,因此使用df$Time <- as.POSIXct(df$Time, format = "%d.%m.%Y :%H:%M", tz = "Asia/Kolkata")。但我得到了 NA 值。这里有什么问题?

【问题讨论】:

  • 不喜欢%H前面的冒号。在您的示例中,是 0 小时 5 分钟吗?
  • @mysteRious 现在我在删除冒号后得到2016-01-01 00:00:05。时间是 0 小时 0 分 05 秒。

标签: r posixct


【解决方案1】:

我怀疑这里有两件事在起作用:时间对象 (POSIXt) 的存储,以及该对象的表示

您提供的字符串(我相信)不是 R 的正确 POSIXt(无论是 POSIXct 还是 POSIXlt)对象,这意味着它只是一个字符串。在这种情况下,您可以使用以下方法将其删除:

gsub(':[^:]*$', '', '1.01.2016 0:00:05')
# [1] "1.01.2016 0:00"

但是,这仍然只是一个字符串,而不是日期或时间对象。如果将其解析为 R 知道的时间对象:

as.POSIXct("1.01.2016 0:00:05", format = "%d.%m.%Y %H:%M:%S", tz = "Asia/Kolkata")
# [1] "2016-01-01 00:00:05 IST"

那么你现在有一个时间对象,R 知道一些...并且它默认以秒精度表示它(在控制台上打印它)。通常,可用于控制台打印的所有更改都是秒的精度,如

options("digits.secs")
# $digits.secs
# NULL
Sys.time()
# [1] "2018-06-26 18:21:06 PDT"
options("digits.secs"=3)
Sys.time()
# [1] "2018-06-26 18:21:10.090 PDT"

那么你可以获得更多。但是,唉,我确实知道认为有一个 R 选项可以说“总是以这种方式打印我的 POSIXt 对象”。所以你唯一的选择是(在你不再需要它成为类时间对象的时候)将它改回一个没有类时间值的字符串:

x <- as.POSIXct("1.01.2016 0:00:05", format = "%d.%m.%Y %H:%M:%S", tz = "Asia/Kolkata")
x
# [1] "2016-01-01 00:00:05 IST"
?strptime
# see that day-of-month can either be "%d" for 01-31 or "%e" for 1-31
format(x, format="%e.%m.%Y %H:%M")
# [1] " 1.01.2016 00:00"

(这同样适用于矢量。)

我的一部分建议转换为POSIXt 并返回到字符串,而不是我的gsub 示例,因为使用as.POSIXct 会告诉您字符串何时与您期望的类似日期时间的对象不匹配,而gsub 会很乐意做错事或什么都不做。

【讨论】:

    【解决方案2】:

    试试asPOSIXlt:

    > test <- "1.01.2016 0:00:05"
    > as.POSIXlt(test, "%d.%m.%Y %H:%M:%S", tz="Asia/Kolkata")
    [1] "2016-01-01 00:00:05 IST"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 2021-11-14
      相关资源
      最近更新 更多