在值列表中转换日期和时间

时间:2016-10-12 07:15:44

标签: r type-conversion

我已阅读Combining date and time into a Date column for plotting及其他相关解决方案,但无法找到答案: 我有一个包含7个元素的字符串列表,其中前两个是日期和时间:

> head(IOlow)
[1] "20160928 142949 0.000172 0.000225 0.000015 0.000172 0.000765"
[2] "20160928 164105 0.000163 0.000227 0.000017 0.000163 0.000908"
[3] "20160928 172826 0.000176 0.000238 0.000017 0.000173 0.001604"

现在我想用包含6个元素的列表替换每个这样的字符串,其中第一个元素是从前两个数字构建的DateTime对象,其他元素是浮点数(而不是字符串)。所以我定义了这个辅助函数:

dateFormat <- "%Y%m%d %H%M%S"
function (x) {
    x <- strsplit(x, split=" ")
    w <- paste(x[[1]][1], x[[1]][2])
    str(w)
    x <- list(as.POSIXlt(w, format=dateFormat), as.double(x[[1]][3:7]))
}

str(w)仅用于调试) 当像这样应用这个功能时

lapply(head(IOlow), to_numeric)

结果如下:

> lapply(head(IOlow), to_numeric)
 chr "20160928 142949"
 chr "20160928 164105"
 chr "20160928 172826"
[[1]]
[[1]][[1]]
[1] "2016-09-28 14:29:49 CEST"

[[1]][[2]]
[1] 0.000172 0.000225 0.000015 0.000172 0.000765


[[2]]
[[2]][[1]]
[1] "2016-09-28 16:41:05 CEST"

[[2]][[2]]
[1] 0.000163 0.000227 0.000017 0.000163 0.000908


[[3]]
[[3]][[1]]
[1] "2016-09-28 17:28:26 CEST"

[[3]][[2]]
[1] 0.000176 0.000238 0.000017 0.000173 0.001604

由于我不明白的原因,R似乎在列表中添加额外的列表(我认为由于列表中有不同的数据类型,我无法返回向量)。 也许只是某些功能没有记录在我需要的方式来理解真正发生的事情。

下一步是从列表列表构建data.frame。

我做错了什么,我该怎么做呢?

系统信息:

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.3.1

3 个答案:

答案 0 :(得分:2)

根据@ A.Val的建议,您是否必须将其作为列表处理?如果它直接在某个文件中存在,则会更直接地使用read.delimreadr::read_delim等内容进行阅读。

缺乏这一点,把你的字符串变成假文件(原因有两个:(1)你的再现性,(2)如果你不能把它作为一个文件来处理,现在你仍然可以使用这个答案):

IOlow <- c("20160928 142949 0.000172 0.000225 0.000015 0.000172 0.000765",
           "20160928 164105 0.000163 0.000227 0.000017 0.000163 0.000908",
           "20160928 172826 0.000176 0.000238 0.000017 0.000173 0.001604")
dat <- read.delim(textConnection(paste(IOlow, collapse = "\n")),
                  sep = " ", header = FALSE)
dat
#         V1     V2       V3       V4      V5       V6       V7
# 1 20160928 142949 0.000172 0.000225 1.5e-05 0.000172 0.000765
# 2 20160928 164105 0.000163 0.000227 1.7e-05 0.000163 0.000908
# 3 20160928 172826 0.000176 0.000238 1.7e-05 0.000173 0.001604

dat$dt <- as.POSIXct(paste(dat$V1, dat$V2, sep = " "), format = "%Y%m%d %H%M%S")
dat <- dat[, -(1:2)]
dat
#         V3       V4      V5       V6       V7                  dt
# 1 0.000172 0.000225 1.5e-05 0.000172 0.000765 2016-09-28 14:29:49
# 2 0.000163 0.000227 1.7e-05 0.000163 0.000908 2016-09-28 16:41:05
# 3 0.000176 0.000238 1.7e-05 0.000173 0.001604 2016-09-28 17:28:26

答案 1 :(得分:1)

我想你想要这样的事,不是吗?

ng-init="advLi.media_order = $index + 1"

答案 2 :(得分:0)

考虑到

apachectl -S 2>&1 | perl -ne '/\((.*site.*):/i && {print $1}'
在@ r2evans的答案中首先将列表转换为文本(dat <- read.delim(textConnection(paste(IOlow, collapse = "\n")), sep = " ", header = FALSE) ),然后解析文本(paste),我认为这太复杂了。所以我重新设计了逻辑:

read.delim(textConnection(...))

然后我建立一个新的&#34;当&#34;日期和时间的变量(我已经在data.frame中添加了名称):

split_line <- function (x) {
    x <- unlist(strsplit(x, split=" "))
}

IOlow <- lapply(IOlow, split_line)
IOlow <- data.frame(do.call(rbind, IOlow), stringsAsFactors=FALSE)

然后我删除日期和时间变量(dateFormat <- "%Y%m%d %H%M%S" IOlow$when <- with(IOlow, as.POSIXct(paste(date, time, sep = " "), format=dateFormat)) )。最后我将剩余的字符串转换为double(这个步骤有更优雅的解决方案吗?):

IOlow <- IOlow[, -(1:2)]