在您的特定示例中,让我们先对其进行分解,看看为什么您会得到 NA 值,然后生成一个解决方案来创建您想要的结果。
> date <- c("1999.04.08", "1999.04.08")
> time <- c("11:00", "12:00")
> df <- data.frame(date, time, stringsAsFactors = F)
> df
date time
1 1999.04.08 11:00
2 1999.04.08 12:00
> str(df)
'data.frame': 2 obs. of 2 variables:
$ date: chr "1999.04.08" "1999.04.08"
$ time: chr "11:00" "12:00"
不要忘记使用str 来了解您正在处理的数据类型。这可以并且将极大地影响您问题的答案。查看函数strptime的帮助说明,我们看到如下定义:
strptime 将字符向量转换为“POSIXlt”类:其输入 x 首先由 as.character 转换。每个输入字符串都按照指定格式进行处理:忽略任何尾随字符。
那么,让我们分解你的代码:
df1 <- within(data,
{ timestamp = strptime(paste(date, time),
"%Y/%m/%d%H:%M:%S")
})
首先,paste 函数:
> paste(date[1], time[1])
[1] "1999.04.08 11:00"
这会生成一个具有上述格式的字符向量。
接下来,strptime 命令。
> strptime(paste(date[1], time[1]), "%Y/%m/%d%H:%M:%S")
[1] NA
好的,我们看到了 NA。首先,一定要明确写format =,如果它读起来很乏味,那么你应该不会有任何问题写出你将永远记住的完美代码。查看我们看到的帮助代码:
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- strptime(x, "%d%b%Y")
> z
[1] "1960-01-01 PST" "1960-01-02 PST" "1960-03-31 PST" "1960-07-30 PDT"
请注意,帮助部分还定义了大写/小写Y,月份和日期变量也是如此。在您的情况下,您尝试提取以下形式的内容:YYYY/mm/ddHH:MM:SS,例如2017/20/1111:28:30。你现在看到问题了吗?
使用您的字符串提取尝试,我们对其稍作修改以获得您正在寻找的格式:
> strptime(paste(date, time), format = "%Y.%m.%d %H:%M")
[1] "1999-04-08 11:00:00 PDT" "1999-04-08 12:00:00 PDT"
把它们放在一起你会得到:
> df1 <- within(df, {timestamp = strptime(paste(date, time), format = "%Y.%m.%d %H:%M")})
> str(df1)
'data.frame': 2 obs. of 3 variables:
$ date : chr "1999.04.08" "1999.04.08"
$ time : chr "11:00" "12:00"
$ timestamp: POSIXlt, format: "1999-04-08 11:00:00" "1999-04-08 12:00:00"
> df1
date time timestamp
1 1999.04.08 11:00 1999-04-08 11:00:00
2 1999.04.08 12:00 1999-04-08 12:00:00
哦,是的,试试dplyr 包。
library(dplyr)
> df %>%
mutate(ts = as.POSIXct(paste(date,time),
format = "%Y.%m.%d %H:%M"))
date time ts
1 1999.04.08 11:00 1999-04-08 11:00:00
2 1999.04.08 12:00 1999-04-08 12:00:00