我正在处理来自 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 将此列转换为时间戳。
我正在处理来自 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 将此列转换为时间戳。
首先,我们需要将分隔毫秒和秒的冒号替换为点,否则最后一步将不起作用(感谢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 并使用%OS3
yield NA
。
使用(或其他与POSIX相关的函数,strptime
例如as.Date
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) 表示的一年中的周数,使用星期日作为一周的第一天(通常将一年中的第一个星期日作为第一周的第一天)。美国公约。%w
工作日为十进制数(0-6,星期日为 0)。%W
一年中的周数为十进制数 (00–53),使用星期一作为一周的第一天(通常将一年中的第一个星期一作为第 1 周的第 1 天)。英国公约。%y
没有世纪的年份 (00–99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀%Y
有世纪的年份。请注意,虽然原始公历中没有零,但 ISO 8601:2004 将其定义为有效(解释为 1BC)