R与Jupyter笔记本:使用dplyr内部连接两个数据帧日期
我正在使用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文档和其他帖子。我可能做错了什么?
感谢您提供有关数据的详细信息。
这是因为时区不同。
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))
@ lisa-de-castro我已经更新了我的答案。这有意义吗? – yutannihilation
嗯,看来你做得很好......你可以通过'dput()'分享最小的数据来重现这个问题吗? – yutannihilation
我编辑了问题以包含数据和我的数据清理过程。我怀疑我的问题在于我如何重新格式化日期或如何读取日期。 –