【问题标题】:How to convert specific time format to timestamp in R? [duplicate]如何将特定时间格式转换为 R 中的时间戳? [复制]
【发布时间】:2013-09-28 01:05:22
【问题描述】:

我正在处理来自 UCI 的“人员活动数据集的本地化数据”数据集,在这个数据集中有一列日期和时间(都在一个列中),格式如下:

27.05.2009 14:03:25:777
27.05.2009 14:03:25:183
27.05.2009 14:03:25:210
27.05.2009 14:03:25:237
...

我想知道是否可以使用 R 将此列转换为时间戳。

【问题讨论】:

  • 最后三位数字代表什么?
  • 你好,索鲁什。看看lubridate 包。

标签: r date formatting posixct


【解决方案1】:

首先,我们需要将分隔毫秒和秒的冒号替换为一个点,否则最后一步将不起作用(感谢Dirk Eddelbuettel 的这一步骤)。由于最终 R 将使用它想要的分隔符,为了更快,我将继续用所有的冒号替换点:

x <- "27.05.2009 14:03:25:777"  # this is a simplified version of your data
y <- gsub(":", ".", x)          # this is your vector with the aforementioned substitution

顺便说一句,这就是你的向量应该如何处理gsub

> y
[1] "27.05.2009 14.03.25.777"

现在,为了让它显示毫秒,您首先需要调整一个 R 选项,然后使用一个名为 strptime 的函数,它将您的日期向量转换为 POSIXlt(一种 R 友好的)格式。只需执行以下操作:

> options(digits.secs = 3)           # this tells R you want it to consider 3 digits for seconds.
> strptime(y, "%d.%m.%Y %H:%M:%OS")  # this finally formats your vector
[1] "2009-05-27 14:03:25.777"

我学会了这个绝妙的技巧hereThis other answer 还说您可以跳过options 设置并使用例如strptime(y, "%d.%m.%Y %H:%M:%OS3"),但这对我不起作用。 Henrik 注意到 function's help page, ?strptime 指出 %OS3 位取决于操作系统。我正在使用更新的 Ubuntu 13.04 并使用 %OS3 产生 NA

使用strptime(或其他与POSIX 相关的函数,如as.Date)时,请记住一些最常用的转换(为简洁起见,根据DWin 的建议进行了编辑。完整列表见strptime ):

  • %a 当前语言环境中的缩写工作日名称。
  • %A 当前语言环境中的完整工作日名称。
  • %b 当前语言环境中的缩写月份名称。
  • %B 当前语言环境中的完整月份名称。
  • %d 十进制数字 (01–31) 为月份中的某天。
  • %H 小时,十进制数 (00–23)。可以输入 24:00:00 等时间。
  • %I 小时,十进制数 (01–12)。
  • %j 十进制数字 (001–366) 为一年中的某天。
  • %m 十进制数字 (01–12) 的月份。
  • %M 分钟为十进制数 (00–59)。
  • %p 区域设置中的 AM/PM 指示器。与%I 一起使用,而不是与%H 一起使用。
  • `%S 秒为十进制数 (00–61),最多允许两个闰秒(但符合 POSIX 的实现将忽略闰秒)。
  • %U 以十进制数 (00–53) 表示的一年中的星期,使用星期日作为一周的第一天(通常将一年中的第一个星期日作为第一周的第一天)。美国公约。
  • %w 工作日为十进制数(0-6,星期日为 0)。
  • %W 以十进制数字 (00–53) 表示的一年中的一周,使用星期一作为一周的第一天(通常将一年中的第一个星期一作为第一周的第一天)。英国公约。
  • %y 没有世纪的年份 (00–99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀
  • %Y 有世纪的年份。请注意,虽然原始公历中没有零,但 ISO 8601:2004 将其定义为有效(解释为 1BC)

【讨论】:

  • a) as.Date() 不需要长格式。 b) 将 as.POSIXct() 包裹在 strptime() 周围,您将获得更紧凑的 POSIXct。 c)您错过了亚秒级。这需要gsub() 或其他格式,因为格式需要一个点;冒号不起作用。
  • 我认为从帮助页面发布整个转换格式表是浪费空间。最好只链接到有人可以找到它的页面,或者只链接到?strptime
  • 我确实提出了替代方案。如果 ?strptime 失败,则 R 安装中断。
  • 大家好,谢谢大家的回答。实际上我的主要问题是(1)最后 3 位数字(毫秒)和(2)日期格式,即 date.month.year。在使用 strptime 函数之前我不知道如何处理它们!
  • 关于“strptime(y, "%d.%m.%Y %H:%M:%OS3"),但它对我不起作用”,另请参见?strptime中示例的注释:## time to sub-second accuracy (**if supported by the OS**); format(Sys.time(), "%H:%M:%OS3")
猜你喜欢
  • 2020-04-12
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2018-03-24
  • 2018-01-06
  • 2014-01-23
  • 1970-01-01
相关资源
最近更新 更多