date time open high low close
1 1999.04.08 11:00 1.0803 1.0817 1.0797 1.0809
2 1999.04.08 12:00 1.0808 1.0821 1.0806 1.0807
3 1999.04.08 13:00 1.0809 1.0814 1.0801 1.0813
4 1999.04.08 14:00 1.0819 1.0845 1.0815 1.0844
5 1999.04.08 15:00 1.0839 1.0857 1.0832 1.0844
6 1999.04.08 16:00 1.0842 1.0852 1.0824 1.0834
我尝试使用此功能执行此操作:
df1 <- within(data, { timestamp = strptime(paste(date, time), "%Y/%m/%d%H:%M:%S") })
但是我得到了NA
s。
我还尝试使用:
data$date_time = mdy_hm(paste(data$date, data$time))
但我又得到了错误:
Warning message: All formats failed to parse. No formats found.
请告诉我我做错了什么。
答案 0 :(得分:1)
在您的特定示例中,让我们首先将其分解,以了解您获取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
将字符向量转换为类&#34; POSIXlt&#34;:其输入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