如何将特定时间格式转换为R中的时间戳?

时间:2013-09-28 01:05:22

标签: r date formatting posixct

我正在研究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将此列转换为时间戳。

1 个答案:

答案 0 :(得分:8)

首先,我们需要用毫秒替换毫秒与点之间的冒号,否则最后一步将无法工作(感谢此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),使用星期日作为一周的第一天(并且通常以一年的第一个星期日作为第1周的第1天)。美国公约。
  • %w工作日为十进制数(0-6,星期日为0)。
  • %W一年中的星期几作为十进制数(00-53),使用星期一作为星期的第一天(通常以一年的第一个星期一作为第1周的第1天)。英国会议。
  • %y没有世纪的年份(00-99)。在输入时,值00到68的前缀为20,而69到99的前缀为19
  • %Y年与世纪。请注意,虽然原始公历中没有零,但ISO 8601:2004将其定义为有效(解释为1BC)