2017-11-18 277 views
1

我正在使用R与Jupyter笔记本。我使用这两个文件中的dplyr创建了两个数据帧:CSV files 为了准备数据,我从“自行车”文件中删除了列,并将日期字符串格式化为日期时间。R与Jupyter笔记本:使用dplyr内部连接两个数据帧日期

# drop colums that contain only one value 
bikes <- select(bikes,-c(contract_name, bonus,banking)) 
# convert UNIX timestamp to a date-time 
bikes$last_update <- bikes$last_update/1000 
bikes$last_update <- as.POSIXct(bikes$last_update, origin="1970-01-01") 

我用lubridate库转换的“Santander_Weather_F”读为“weath”将日期转换为好。

weath$Date <- parse_date_time(weath$Date, "mdy") 

这是我如何创建我的新的数据帧:

avg_bikes_d <- bikes %>% select(last_update,available_bikes) %>% group_by(Date=lubridate::round_date(last_update,unit="day")) %>% 
    summarise(avg_bikes=round(mean(available_bikes),0)) 
avg_weath <- weath %>% select(Date, temp_avg, wind_avg) 

第一数据帧的数量通过柱14的含义可以追溯到可重复包含的值1。由此产生的数据帧的头部看起来像这样:

| number | Date  | avg_bikes | 
|--------|------------|-----------| 
| 1  | 2017-05-30 | 0   | 
| 1  | 2017-05-31 | 0   | 
| 1  | 2017-06-01 | 2   | 
| 1  | 2017-06-06 | 8   | 
| 1  | 2017-06-07 | 17  | 
| 1  | 2017-06-08 | 31  | 

| Date  | temp_avg | wind_avg | 
|------------|----------|----------| 
| 2017-05-29 | 65  | 3  | 
| 2017-05-30 | 64  | 3  | 
| 2017-05-31 | 63  | 5  | 
| 2017-06-01 | 66  | 3  | 
| 2017-06-02 | 62  | 6  | 
| 2017-06-03 | 61  | 5  | 

我希望做的日期内连接: avg <- inner_join(avg_bikes_d, avg_weath, by="Date") 但所有导致是一个空的数据帧。 我试图删除第一个数据帧的数字列作为支票,但仍然没有。我检查了日期列的格式是否正确使用is.POSIXct()我还搜索了dplyr文档和其他帖子。我可能做错了什么?

+1

嗯,看来你做得很好......你可以通过'dput()'分享最小的数据来重现这个问题吗? – yutannihilation

+0

我编辑了问题以包含数据和我的数据清理过程。我怀疑我的问题在于我如何重新格式化日期或如何读取日期。 –

回答

1

感谢您提供有关数据的详细信息。

这是因为时区不同。

avg_weath$Date[2] 
#> [1] "2017-05-30 UTC" 

# "JST" is my default timezone, so you probably get a different result. 
avg_bikes_d$Date[1] 
#> [1] "2017-05-30 JST" 

C.F. https://github.com/tidyverse/dplyr/issues/3059

第一个解析数字的结果没有时间戳,所以它们是不明确的。你知道这两个时间戳代表不同的时间点:

  • 2017-05-30 00:00:00 UTC
  • 2017-05-30 00:00:00 JST

但是,所有的权利,我们不能确定哪一个数字053017实际上代表。这里,parse_date_time()假定时区为UTC(如果没有提供tz参数)。

第二个来自时代秒。这与时区无关,所以我们可以唯一确定时间戳。

bikes$last_update <- as.POSIXct(bikes$last_update, origin="1970-01-01") 

使用时区是一项艰巨的工作。一种解决方案可以使用force_tz()

avg_bikes_d$Date <- force_tz(avg_bikes_d$Date, "UTC") 

但我猜你真正需要的是日期,而不是时间戳。那么,如何将Date列转换为Date类而不是POSIXct

weath$Date <- date(parse_date_time(weath$Date, "mdy")) 

avg_bikes_d <- bikes %>% 
    select(last_update,available_bikes) %>% 
    group_by(Date=date(last_update)) %>% 
    summarise(avg_bikes=round(mean(available_bikes),0)) 
+0

@ lisa-de-castro我已经更新了我的答案。这有意义吗? – yutannihilation

相关问题