2014-04-20 80 views
2

我使用OmegaHat的RGoogleDocs包將我的Google表格電子表格導入到R. 其中一些包含日期數據,時間數據和日期/時間數據。Google表格導入到R的日期和時間對象

在導入到R後,RGoogleDocs會將日期和時間轉換爲十進制數字,推測可能是從開始引用1900-1-1(或1899-12-30)開始的秒數。

這對日期來說不是問題,因爲我只需使用as.Date()即可將其轉換。 但是,時間數據是一個巨大的麻煩。

我知道我可以使用as.POSIXct()as.POSIXlt()但是,這並不能準確地將十進制數轉換回日期和時間。

Observe: 

Timestamp: 
2/10/2014 19:22:40; 2/10/2014 19:52:07; 2/10/2014 20:14:47; 

2/10/2014 21:08:03; 2/11/2014 11:05:39; 2/11/2014 12:21:40; 

2/11/2014 12:44:33; 2/11/2014 16:08:54; 2/11/2014 16:31:44; 

2/12/2014 10:54:31; 2/12/2014 11:38:15; 2/12/2014 11:56:18; 

2/12/2014 12:31:53; 2/12/2014 14:42:46; 2/12/2014 15:03:36; 

2/13/2014 14:38:17; 2/13/2014 15:08:45; 2/13/2014 16:39:27; 

2/13/2014 17:18:45; 2/13/2014 19:14:23; 2/19/2014 15:01:16; 

2/19/2014 15:05:43; 

RGoogleDocs'進口版本:

> mydata$"Timestamp" 
[1] 41680.81 41680.83 41680.84 41680.88 41681.46 41681.52 41681.53 41681.67 
[9] 41681.69 41682.45 41682.48 41682.50 41682.52 41682.61 41682.63 41683.61 
[17] 41683.63 41683.69 41683.72 41683.80 41689.63 41689.63 

轉換後:

as.POSIXct(mydata$"Timestamp"*86400, origin = "1899-12-30") 
[1] "2014-02-11 00:22:40 PKT" "2014-02-11 00:52:07 PKT" "2014-02-11 01:14:47 PKT" 
[4] "2014-02-11 02:08:02 PKT" "2014-02-11 16:05:39 PKT" "2014-02-11 17:21:40 PKT" 
[7] "2014-02-11 17:44:33 PKT" "2014-02-11 21:08:54 PKT" "2014-02-11 21:31:44 PKT" 
[10] "2014-02-12 15:54:31 PKT" "2014-02-12 16:38:15 PKT" "2014-02-12 16:56:18 PKT" 
[13] "2014-02-12 17:31:53 PKT" "2014-02-12 19:42:45 PKT" "2014-02-12 20:03:36 PKT" 
[16] "2014-02-13 19:38:17 PKT" "2014-02-13 20:08:45 PKT" "2014-02-13 21:39:27 PKT" 
[19] "2014-02-13 22:18:45 PKT" "2014-02-14 00:14:22 PKT" "2014-02-19 20:01:16 PKT" 
[22] "2014-02-19 20:05:42 PKT" 

不僅是時間不準確,誤差逐漸增加,在列表中向下。誰能幫忙?

+0

你能提供一個鏈接到你的谷歌電子表格的公共版本(甚至只是時間戳列)嗎? – hrbrmstr

+0

https://docs.google.com/spreadsheet/ccc?key = 0AqIRsZWcpw-gdEJZV01UVGNSWkxqSlI1VkRrN2NOdXc&usp = sharing – naveedpash

回答

0

Thx用於發佈鏈接。我做了一個副本(所以你可以不分享它,如果你現在想:-)。儘管電子表格屬性爲GMT-8,但它看起來像RGoogleDocs正在爲您提供GMT(UTC)中的數字位。我不張貼所有的設置代碼RGoogleDocs但我以爲你不喜歡的東西如下:使用

docs <- getDocs(sheets.con) 
ts <- getWorksheets(docs$rrr, sheets.con) 
dat <- sheetAsMatrix(ts$`Form Responses`, header = TRUE, as.data.frame = TRUE, trim = TRUE) 

RGoogleDocs沒有,事實上,發回天值VS的時刻字符串的數量(儘管CSV出口字符串版本):

dat$Timestamp 
## [1] 41689.63 41683.72 41680.88 41680.81 41683.69 41681.67 41681.69 41682.45 41682.48 41682.50 41683.80 
## [12] 41689.63 41680.83 41681.52 41681.46 41680.84 41682.52 41682.61 41683.61 41683.63 41681.53 41682.63 

但是,我沒有看到的轉換錯誤(可能是幾秒鐘),你是:

as.POSIXct(dat$Timestamp*86400, origin="1899-12-30 00:00:00", tz="GMT") 
## [1] "2014-02-19 15:05:42 GMT" "2014-02-13 17:18:45 GMT" "2014-02-10 21:08:03 GMT" 
## [4] "2014-02-10 19:22:39 GMT" "2014-02-13 16:39:27 GMT" "2014-02-11 16:08:53 GMT" 
## [7] "2014-02-11 16:31:44 GMT" "2014-02-12 10:54:31 GMT" "2014-02-12 11:38:14 GMT" 
## [10] "2014-02-12 11:56:18 GMT" "2014-02-13 19:14:23 GMT" "2014-02-19 15:01:15 GMT" 
## [13] "2014-02-10 19:52:07 GMT" "2014-02-11 12:21:40 GMT" "2014-02-11 11:05:38 GMT" 
## [16] "2014-02-10 20:14:46 GMT" "2014-02-12 12:31:52 GMT" "2014-02-12 14:42:45 GMT" 
## [19] "2014-02-13 14:38:17 GMT" "2014-02-13 15:08:45 GMT" "2014-02-11 12:44:33 GMT" 
## [22] "2014-02-12 15:03:36 GMT" 

(粘貼從谷歌文檔導出的CSV文件VS使用屏幕帽)

Timestamp,DOA,DOD,Length of Stay,Time of Event,Date of Event,Presentation Time,Presentation Date,Time to Presentation 
2/19/2014 15:05:43,9/6/2010,9/10/2010,4,,,0:30:00,9/6/2010, 
2/13/2014 17:18:45,12/28/2009,1/1/2010,4,16:13:00,,20:59:00,12/28/2009, 
2/10/2014 21:08:03,12/28/2009,1/2/2010,5,16:13:00,12/28/2009,17:51:00,12/28/2009, 
2/10/2014 19:22:40,12/28/2009,1/1/2010,4,16:00:00,12/28/2009,22:00:00,12/28/2009, 
2/13/2014 16:39:27,3/22/2013,3/29/2013,7,,,4:46:00,3/22/2013, 
2/11/2014 16:08:54,2/21/2013,4/3/2013,41,18:00:00,2/16/2013,2:49:00,2/21/2013, 
2/11/2014 16:31:44,2/21/2013,2/27/2013,6,18:00:00,,5:35:00,2/21/2013, 
2/12/2014 10:54:31,2/21/2013,3/5/2013,12,,,5:35:00,2/21/2013, 
2/12/2014 11:38:15,2/21/2013,3/12/2013,19,18:00:00,2/20/2013,3:14:00,2/21/2013, 
2/12/2014 11:56:18,2/21/2013,2/27/2013,6,,,3:16:00,2/21/2013, 
2/13/2014 19:14:23,3/4/2013,3/21/2013,17,19:00:00,,2:05:00,3/4/2013, 
2/19/2014 15:01:16,3/3/2013,3/19/2013,16,22:00:00,,0:00:00,3/4/2013, 
2/10/2014 19:52:07,3/3/2013,3/5/2013,2,,3/3/2013,22:16:00,3/3/2013, 
2/11/2014 12:21:40,4/24/2013,5/28/2013,34,19:00:00,4/23/2013,23:30:00,4/24/2013, 
2/11/2014 11:05:39,3/5/2013,3/13/2013,8,21:25:00,3/3/2013,4:17:00,3/5/2013, 
2/10/2014 20:14:47,5/5/2013,6/3/2013,29,21:45:00,5/5/2013,0:45:00,5/5/2013, 
2/12/2014 12:31:53,11/23/2013,11/29/2013,6,23:35:00,11/23/2013,1:01:00,11/23/2013, 
2/12/2014 14:42:46,11/26/2013,12/11/2013,15,9:20:00,,22:18:00,11/26/2013, 
2/13/2014 14:38:17,12/12/2013,12/24/2013,12,,,21:56:00,12/11/2013, 
2/13/2014 15:08:45,3/4/2013,3/14/2013,10,,3/3/2013,2:30:00,3/4/2013, 
2/11/2014 12:44:33,8/9/2013,8/20/2013,11,,8/8/2013,10:43:00,8/9/2013, 
2/12/2014 15:03:36,9/28/2013,9/30/2013,2,,,12:14:00,9/28/2013, 

您可以驗證的時區設置,既爲您的谷歌驅動器的默認值和電子表格本身?這可能是問題。

+0

我的機器和電子表格都設置爲相同的時區PKT。 但是,我添加了'tz =「GMT」',就像你做的那樣,它工作。也許RGoogleDocs消除了間隔差異,並在導入期間重置爲UTC。 感謝您的幫助! – naveedpash

0

等待,掛....我試圖做的計算與利用薄片時間數據的休息,他們把出精品無需添加tz = "GMT"。然後我意識到Timestamp是Google自動生成的。該電子表格與表單相關聯,我想跟蹤自己的研究進展,因此我建立了自動時間戳以加快數據收集速度。該時間戳按照UTC發佈。其餘數據遵循PKT的宗教信仰。 所以我不小心結束了在同一個數據集中的兩個不同的時區。

儘管如此,謝謝@hrbrmstr讓我意識到我需要考慮時區! 如果我有日光節約的問題,我會與您聯繫。

+0

啊。是。這就說得通了。 Google Docs(雲端硬盤)用戶與'= NOW()'存在愛/恨關係。它應該是不太可預測的。 *應該*使用本地電子表格TZ設置,但是當它沒有時,我已經看過產品論壇帖子(並親身體驗過)。如果我們有機會的話,只有我們全部切換到Swatch [Internet Time](http://www.swatch.com/zz_en/internettime/):-) – hrbrmstr

+0

:O令人驚歎的概念想知道是否有API。 – naveedpash

相關問題