我有一些日内数据,其索引格式为
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返回的数据。关于如何解决这个问题的任何想法?
答案 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
在第一组和第二组之间插入零。
您还可以使用strsplit
和lapply
插入零。这会慢一点。
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"