2017-09-02 41 views
1

我有一個數據框在R,我已經從CSV導入。在CSV的 「時間」 的格式是 「%Y-%間 - %d%H:%M:%S」,例如:lubridate轉換午夜時間戳返回不適用:如何填寫缺少的時間戳

> head(btc_data) 
       time btc_price 
1 2017-08-27 22:50:00 4,389.6113 
2 2017-08-27 22:51:00 4,389.0850 
3 2017-08-27 22:52:00 4,388.8625 
4 2017-08-27 22:53:00 4,389.7888 
5 2017-08-27 22:56:00 4,389.9138 
6 2017-08-27 22:57:00 4,390.1663 

當運行str(btc_data)時間列回來爲一個因素。

btc_data$time <- ymd_hms(as.character(btc_data$time)) 

的問題是在午夜(5行)中收集的數據無法解析,並返回NA值像這樣(在原始數據的時間戳:因此,我已經採用lubridate包如下轉化這對日期時間從這些行,以便2017-08-29 00:00:00列出簡稱爲2017-08-29)缺失 -

724 2017-08-28 23:59:00 4,439.3313 
725 NA     4,439.6588 
726 2017-08-29 00:01:00 4,440.3050 

此外,第二數據幀被不同地組織:

> str(eth_data) 
'data.frame': 1081 obs. of 2 variables: 
$ time  : Factor w/ 1081 levels "8/28/17 16:19",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ eth_price: num 344 344 344 344 343 ... 

當我嘗試:

> eth_data$time <- mdy_hms(as.character(eth_data$time)) 

我收到以下錯誤:

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

編輯:我已經分離的代碼問題是造成問題的原因:

> btc_data[721:726,] 
        time btc_price 
721 2017-08-28 23:57:00 4,439.8163 
722 2017-08-28 23:58:00 4,440.2363 
723 2017-08-28 23:58:00 4,440.2363 
724 2017-08-28 23:59:00 4,439.3313 
725 2017-08-29   4,439.6588 
726 2017-08-29 00:01:00 4,440.3050 

所以,每次午夜時鐘敲響時,都不記錄時間戳。 CSV正在通過數據流創建並不斷增長,所以除非我能找到解決方法,否則每個新的一天都會繼續發生此問題。有什麼建議麼?

+0

請包括失敗的行。 –

+0

請參閱我的編輯 - 我添加了失敗的行,第二個df完全失敗。 – zsad512

+0

在lubridate有機會混搭它之前向我們顯示* text *。是00:00:00還是24:00:00? – Spacedman

回答

2

如果'00:00:00'在原始數據中完全缺失,可以使用grep找到這些情況,然後在使用ymd_hms()或mdy_hm之前粘貼'00:00:00' ()函數。

第一種情況,其中,日期/時間格式爲 'YYYY-MM-DD HH:MM:SS':

#Before 
test <- fread("time, btc_price 
2017-08-28 23:57:00, 4439.8163 
2017-08-28 23:58:00, 4440.2363 
2017-08-28 23:58:00, 4440.2363 
2017-08-28 23:59:00, 4439.3313 
2017-08-29   , 4439.6588 
2017-08-29 00:01:00, 4440.3050") 

test$time[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}$",test$time)] <- paste(
    test$time[grep("[0-9]{4}-[0-9]{2}-[0-9]{2}$",test$time)],"00:00:00") 

#After 
print(test) 

        time btc_price 
1: 2017-08-28 23:57:00 4439.816 
2: 2017-08-28 23:58:00 4440.236 
3: 2017-08-28 23:58:00 4440.236 
4: 2017-08-28 23:59:00 4439.331 
5: 2017-08-29 00:00:00 4439.659 
6: 2017-08-29 00:01:00 4440.305 

#Now you can use ymd_hms(as.character(df$date)) as usual. 

第二種情況,其中,日期/時間格式是「米/ DD/YY HH: MM':

#Step 1 is to find/replace: 
test <- fread("time, btc_price 
8/28/17 23:57, 4439.8163 
8/28/17 23:57, 4440.2363 
8/28/17 23:57, 4440.2363 
8/28/17 23:57, 4439.3313 
8/28/17  , 4439.6588 
8/29/17 00:01, 4440.3050") 

test$time[grep("[0-9]{1}/[0-9]{2}/[0-9]{2}$",test$time)] <- paste(
    test$time[grep("[0-9]{1}/[0-9]{2}/[0-9]{2}$",test$time)],"00:00" 
) 

print(test) 
      time btc_price 
1: 8/28/17 23:57 4439.816 
2: 8/28/17 23:57 4440.236 
3: 8/28/17 23:57 4440.236 
4: 8/28/17 23:57 4439.331 
5: 8/28/17 00:00 4439.659 
6: 8/29/17 00:01 4440.305 

#Step 2 is to adjust your mdy_hms() command; you need to leave off the 's': 
#Ex. before: 
mdy_hms(as.character("8/28/17 16:19")) 
[1] NA 
Warning message: 
All formats failed to parse. No formats found. 

#After 
test <- c("8/28/17 16:19","8/28/17 00:00") 
mdy_hm(as.character(test)) 
[1] "2017-08-28 16:19:00 UTC" "2017-08-28 00:00:00 UTC" 

一般來說,數字在R中沒有逗號格式化也是一個好習慣。所以4,439.3313應該是4439.3313。否則,R可能會將其解釋爲列之間的逗號分隔。

+0

請參閱已編輯的問題,問題不在'btc_price'列(正在讀取正確)中,而是在'date'列中丟失錯誤的午夜時間戳。 – zsad512

+0

我覺得你還是不理解。對於'2017-08-29',你已經添加了'00:00:00 UTC'的時間戳,但是如果仔細查看我的問題,這是從數據中丟失的 - 這是潛在的問題....如何插入00 :00:00在日期時間內缺少時間戳的地方。 – zsad512

+0

@ zsad512 - 現在你已經澄清了這個問題,我已經編輯了我的答案。查看上面的更新。 – www