【问题标题】:Join date and time加入日期和时间
【发布时间】:2018-05-04 02:22:32
【问题描述】:

下午好!我有包含股价日期和时间的数据。我需要将此数据加入一列。

        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") })

但我得到了NAs 的专栏。

我也尝试使用:

data$date_time = mdy_hm(paste(data$date, data$time))

但我又得到了错误:

Warning message:
    All formats failed to parse. No formats found.

请告诉我我做错了什么。

【问题讨论】:

  • 匹配您的标记和分隔符:data$timestamp &lt;- as.POSIXct(paste(data$date, data$time), format = '%Y.%m.%d %H:%M')lubridate::ymd_hm(paste(data$date, data$time))

标签: r date


【解决方案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 将字符向量转换为“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

【讨论】:

  • 这是很棒的描述。我理解我的错误。谢谢!!
  • Kamil,现在我有一个问题:我需要通过 ts 变量计算第一次和第二次观察之间的差异:ts[2]-ts[1],但 R 打印出“时间差1 小时。但是如何简化 R 将打印“1h”且没有其他文本的答案?
  • 有多种方式123 等。一个简单的技巧,你应该在未来用更优雅的东西替换它,就是将as.numeric 包裹在difftime 周围。试试as.numeric(difftime(Sys.Date(), Sys.Date()+1, units = "hours"))
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多