加入日期和时间

时间:2017-11-20 19:02:24

标签: r date

下午好!我有数据包括股价的日期和时间。我需要将这些数据加入到一列中。

        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.

请告诉我我做错了什么。

1 个答案:

答案 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