6

我正在处理来自 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 将此列转换为时间戳。

4

1 回答 1

13

首先,我们需要将分隔毫秒和秒的冒号替换为点,否则最后一步将不起作用(感谢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"

我在这里学到了这个好技巧。This other answer还说您可以跳过options设置并使用,例如,strptime(y, "%d.%m.%Y %H:%M:%OS3")但它对我不起作用。Henrik指出该函数的帮助页面?strptime指出该%OS3位取决于操作系统。我正在使用更新的 Ubuntu 13.04 并使用%OS3yield NA

使用(或其他与POSIX相关的函数strptime例如as.Datestrptime

  • %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),使用星期一作为一周的第一天(通常将一年中的第一个星期一作为第 1 周的第 1 天)。英国公约。
  • %y没有世纪的年份 (00–99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀
  • %Y有世纪的年份。请注意,虽然原始公历中没有零,但 ISO 8601:2004 将其定义为有效(解释为 1BC)
于 2013-09-28T01:42:51.043 回答