2017-11-18 184 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

相關問題