我正在研究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将此列转换为时间戳。
答案 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"
我已经学会了这个好方法here。 This 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
结合使用。%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)