2017-01-06 7 views
1

에서 삽입 mongodb의 timestamp와 함께 예측 모델의 예측 값을 삽입하려고합니다.mongodb에서 json date obeject를 R

다음 코드는 R 데이터 프레임을 json으로 변환 한 다음 bson으로 변환합니다. 그러나 결과가 mongodb에 삽입되면 타임 스탬프가 날짜 객체로 인식되지 않습니다.

mongo1 <-mongo.create(host = "localhost:27017",db = "test",username = "test",password = "test") 
rev<-data.frame(ts=c("2017-01-06 05:30:00","2017-01-06 05:31:00","2017-01-06 05:32:00","2017-01-06 05:33:00","2017-01-06 05:34:00"),value=c(10,20,30,40,50)) 
rev$ts<-as.POSIXct(strptime(rev$ts,format = "%Y-%m-%d %H:%M:%S",tz="")) 

revno<-"Revision1" 

mylist <- list() 
mylist[[ revno ]] <- rev 
mylist["lastRevision"]<-revno 

StartTime<-"2017-01-06 05:30:00" 

site<-"Site1" 
id <- mongo.bson.buffer.create() 
mongo.bson.buffer.append(id, "site",site) 
mongo.bson.buffer.append(id, "ts",as.POSIXct(strptime(StartTime,format = "%Y-%m-%d %H:%M:%S",tz=""))) 
s <- mongo.bson.from.buffer(id) 

rev.json<-toJSON(mylist,POSIXt=c("mongo")) 
rev.bson<-mongo.bson.from.JSON(rev.json) 


actPower <- mongo.bson.buffer.create() 
mongo.bson.buffer.append(actPower, "_id",s) 
mongo.bson.buffer.append(actPower,"activePower",rev.bson) 
x <- mongo.bson.from.buffer(actPower) 
x 

mongo.insert(mongo1,'solarpulse.forecast',x) 

실제 출력 :

{ 
    "_id" : { 
     "site" : "site1", 
     "ts" : ISODate("2017-01-06T18:30:00Z") 
    }, 
    "activePower" : { 
     "Revision1" : [ 
      { 
       "ts" : 1483660800000, 
       "value" : 10 
      }, 
      { 
       "ts" : 1483660860000, 
       "value" : 20 
      }, 
      { 
       "ts" : 1483660920000, 
       "value" : 30 
      }, 
      { 
       "ts" : 1483660980000, 
       "value" : 40 
      }, 
      { 
       "ts" : 1483661040000, 
       "value" : 50 
      } 
     ], 
     "lastRevision" : [ 
      "Revision1" 
     ] 
    } 
} 

예상 출력 형식 :

"_id" : { 
     "site" : "test", 
     "ts" : ISODate("2016-12-18T18:30:00Z") 
    } 

"Revision1": [{ 
     "ts": ISODate("2016-12-19T07:30:00Z"), 
     "value": 31 
    }, { 
     "ts": ISODate("2016-12-19T07:45:00Z"), 
     "value": 52 
    }, { 
     "ts": ISODate("2016-12-19T08:00:00Z"), 
     "value": 53 
    }, { 
     "ts": ISODate("2016-12-19T08:15:00Z"), 
     "value": 30 
    }, { 
     "ts": ISODate("2016-12-19T08:30:00Z"), 
     "value": 43 
    }, { 
     "ts": ISODate("2016-12-19T08:45:00Z"), 
     "value": 31 
    }, { 
     "ts": ISODate("2016-12-19T09:00:00Z"), 
     "value": 16 
    }, { 
     "ts": ISODate("2016-12-19T09:15:00Z"), 
     "value": 39 
    }, { 
     "ts": ISODate("2016-12-19T09:30:00Z"), 
     "value": 17 
    }, { 
     "ts": ISODate("2016-12-19T09:45:00Z"), 
     "value": 45 
    }, { 
     "ts": ISODate("2016-12-19T10:00:00Z"), 
     "value": 60 
    }, { 
     "ts": ISODate("2016-12-19T10:15:00Z"), 
     "value": 39 
    }, { 
     "ts": ISODate("2016-12-19T10:30:00Z"), 
     "value": 46 
    }, { 
     "ts": ISODate("2016-12-19T10:45:00Z"), 
     "value": 57 
    }, { 
     "ts": ISODate("2016-12-19T11:00:00Z"), 
     "value": 29 
    }, { 
     "ts": ISODate("2016-12-19T11:15:00Z"), 
     "value": 7 
    }] 
+0

ISODates()ts 값을 변환하는 함수를 작성합니다. –

+0

'library (rmongodb)'는 [CRAN에없고 더 이상 지원되지 않습니다] (https://github.com/dselivanov/rmongodb)라는 점에 유의해야합니다. 아마도'라이브러리 (몽골 라이트)'로 시도해보십시오. – SymbolixAU

답변

0

당신은 정확하게 당신을 위해 날짜를 삽입 library(mongolite)을 사용할 수 있습니다. 그러나, 나는 정확하게 그것을 삽입하여 data.frames을 사용하는 날짜를 삽입 할 수있었습니다. lists 또는 JSON 문자열을 올바르게 사용하여 날짜를 삽입 할 수 없습니다.

여기에 data.frame을 사용하여 데이터를 삽입하는 작업 예제가 있습니다.

library(mongolite) 

m <- mongo(collection = "test_dates", db = "test", url = "mongodb://localhost") 

# m$drop() 

df <- data.frame(id = c("site1","site2"), 
       ts = c(Sys.time(), Sys.time())) 

m$insert(df) 
#Complete! Processed total of 2 rows. 
#$nInserted 
#[1] 2 
# 
#$nMatched 
#[1] 0 
# 
#$nRemoved 
#[1] 0 
# 
#$nUpserted 
#[1] 0 
# 
#$writeErrors 
#list() 

enter image description here

잠재적 인 (그러나 이상적이지) 솔루션은 data.frame에 목록을 강요하고 그를 삽입 할 수

.

rev<-data.frame(ts=c("2017-01-06 05:30:00","2017-01-06 05:31:00","2017- 

01-06 05:32:00","2017-01-06 05:33:00","2017-01-06 05:34:00"),value=c(10,20,30,40,50)) 
rev$ts<-as.POSIXct(strptime(rev$ts,format = "%Y-%m-%d %H:%M:%S",tz="")) 

revno<-"Revision1" 

mylist <- list() 
mylist[[ revno ]] <- rev 
mylist["lastRevision"]<-revno 

m$insert(data.frame(mylist)) 

또는 양자 택일로, 당신의 목록을 삽입 한 다음,이 풀다하기 어려운 틱 될 수있는 재현 예를하지 않고 직접 몽고