as.POSIXct不承认上午9点

时间:2014-04-13 18:35:53

标签: r posixct

我有一些日内数据,其索引格式为

c('20140304 95700', '20140304 95800', '20140304 95900', '20140304 100000')

当我尝试使用datetime将字符串转换为as.POSIXct对象时,转换无法识别第九小时内发生的任何时间,而且似乎是因为它们之前不是0。

例如,当我跑

data$DATE <- as.POSIXct(data$DATE, format = "%Y%m%d H%M%S", tz = "EST5EDT")

第九小时后的所有内容格式正确。它只是第九小时内作为NA返回的数据。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:1)

金龙给你的评论是正确的。你需要在你的工作时间领先0。所以将它们附加到你的琴弦上。

dates <- c('20140304 095700', '20140304 095800', '20140304 095900', '20140304 100000')

最好将您的字符串转换为适当的格式,例如&#39; 2014-03-04 09:57:00&#39;避免令人讨厌的惊喜。

此外,%的定位不正确

as.POSIXct(data$DATE, format = "%Y%m%d H%M%S", tz = "EST5EDT")

它应该是这样的(对于您的适当时区 - &#34;&#34;应该为您的设置提供默认值):

as.POSIXct(data$DATE, format = "%Y%m%d %H%M%S", tz = "", origin = '1970-01-01')

答案 1 :(得分:1)

如果可以安全地假设所有具有5位数的时间都应该具有前导零,则可以使用以下方法来插入这些零。

times <- c('20140304 95700', '20140304 95800', '20140304 95900', '20140304 100000')
new.times <- sub("(.* )(\\d{5})$", "\\10\\2", times)
as.POSIXct(new.times, format="%Y%m%d %H%M%S")
#[1] "2014-03-04 09:57:00 CST" "2014-03-04 09:58:00 CST" "2014-03-04 09:59:00 CST" "2014-03-04 10:00:00 CST"

sub调用中的模式有两组括号:

(.* ):这是任何次数,其次是空格
(\\d{5})$:这是5位数。 $表示5位数字位于字符串的末尾

第二个参数指定替换与模式匹配的字符串。 \\1表示“第一组”,在本例中是字符串“time”部分之前的所有内容。 \\1表示“第二组”,即5位数。即\\10\\2在第一组和第二组之间插入零。


您还可以使用strsplitlapply插入零。这会慢一点。

sapply(strsplit(times, " "), 
       function(x) paste(x[1], if (nchar(x[2]) == 5L) paste0("0", x[2]) else x[2]))
#[1] "20140304 095700" "20140304 095800" "20140304 095900" "20140304 100000"