2017-03-03 13 views
1

프로그래밍에 익숙하지 않은 환경 과학 연구원은 쉽게 나를 따라갑니다!날짜 형식 대기 질 데이터의 기능 프로그래밍

데이터를 로깅하고 .csv 파일로 저장하는 두 개의 대기 질 기기 (dusttrak 및 ptrak)가 있습니다. 필자의 목표는 함수 프로그래밍을 통해 데이터 정리 프로세스를 자동화하는 것입니다. 각 악기는 서로 다른 시간 간격 (30 초 vs 1 초)으로 기록하고 각 악기에는 고유 한 머리말이 있습니다.

이미 ptrak 데이터를 읽는 기능이 있습니다. 불쾌한 헤더를 지우고 날짜와 시간 컬럼을 하나의 as.POSIX datetime으로 변환합니다. 결과는 datetime 및 particle number concentration (pnc)의 두 개의 열만있는 새로운 와이드 형식 데이터 프레임입니다.

## assume there is only one file per directory for now 
read.ptrak<-function(fpath){ 
    x<-read.csv(fpath,skip=30,header=FALSE,stringsAsFactors=FALSE) #removing the first 30 rows of garbage 
    colnames(x) <- c("date","time","pnc") #creating my own header 
    ##merge date and time column together 
    x$datetime<-strptime(paste(x$date,x$time), "%m/%d/%Y %H:%M:%S", tz="UTC") 
    ## convert the first column to a posix timestamp 
    x$datetime<-as.POSIXct(x$datetime,format=dt_format, tz="UTC") 
    x<-x[,-c(1:2)] ## remove redundant variables date, and time 
    x<-x[,c(2:1)] ## reorder columns so datetime is first 
    return(x) 
} 

#okay now we can apply our function to our ptrak csv file: 
ptrak_data <- read.ptrak(**INSERT FILE PATH HERE**) 
head(ptrak_data) 
#everything looks great! 

내가 문제로 실행 해요 dusttrak 데이터입니다 :

다음은 ptrak 기능입니다. 각 관측마다 날짜 및 시간 열이있는 대신 머리글 내에 시작 시간 만 제공됩니다. 실제 데이터 프레임은이 시작 시간부터 30 초 간격으로 총 경과 시간 만 제공합니다. 필자는 POSIX 타임 스탬프와 5 개의 입자 질량 농도 (아래 참조)를 가지고 나중에 ptrak과 datetime으로 병합 할 수있는 새로운 데이터 프레임을 만들고 싶습니다. 누구든지 시작 시간과 경과 시간을 사용하여 새로운 날짜/시간 벡터를 생성 한 다음 헤더를 제거하여 두 개의 열이있는 와이드 형식 데이터 프레임을 남길 수있는 함수를 제공 할 수 있습니까?

가 여기에 dusttrak 데이터를 청소에서 내 첫 번째 시도이다 :

최종 목표는 대신 (PNC) 하나 개의 입자 수 농도를보고 제외하고는 ptrak 데이터와 유사한 청소 dataframe을 생산하는 것입니다
read.dtrak<-function(fpath){ 
    x<-read.csv(fpath,skip=36,header=FALSE,stringsAsFactors=FALSE) 
    colnames(x)<-c("elapsedtime","pm1","pm2.5","pm4","pm10","total","alarms","errors") 
    ## need to read in the same file again and keep the header to extract the start time and start date: 
    y<-read.csv(fpath,skip=6,header=FALSE,stringsAsFactors=FALSE) 
    colnames(y)<-c("variable","value") ## somewhat arbitrary colnames for temporary df 
    starttime <-y[1,2] 
    startdate <-y[2,2] 
    startdatetime <- strptime(paste(startdate,starttime), "%m/%d/%Y %H:%M:%S", tz="UTC") 
    #convert to posix timestamp: 
    startdatetime <-as.POSIXct(startdatetime, format=dt_format, tz="UTC") 
    ## create a new variable called datetime in dataframe 'x' 
    x$datetime <- startdatetime + x$elapsedtime ## this is giving me the following error: "Error in unclass(e1) + unclass(e2) : non-numeric argument to binary operator 
    return(x) 
} 

, PM1, PM2.5, PM4, PM10 및 TOTAL이 있어야합니다 (dusttrak_data.csv 참조).

게시물에 샘플 데이터를 포함하지 않기 때문에 미리 사과드립니다. 그 성가신 헤더를 포함하는 샘플 데이터를 작성하는 방법을 알 수 없었습니다!

이 질문에 대한 대답을 찾으면 본질적으로 +100 시간의 수동 데이터 정리 작업을 절약 할 수 있으므로 귀하의 통찰력에 진심으로 감사드립니다!

가 여기에 데이터의 : Ptrak, Dusttrak 편집 : 관심이있는 사람들을위한 기능에 Dave2e의 솔루션의 변환.

read.dtrak<-function(fpath){ 
    sdate<-read.csv(fpath, header=FALSE, nrow=1, skip =7) 
    stime <-read.csv(fpath, header = FALSE, nrow=1, skip=8) 
    startDate<-as.POSIXct(paste(sdate$V2, stime$V2), "%m/%d/%Y %H:%M:%S", tz="UTC") 
    x<-read.csv(fpath, skip=36, stringsAsFactors = FALSE) 
    names(x)<-c("elapsedtime","pm1","pm2.5","pm4","pm10","total","alarms","errors") 
    x$elapsedtime<-x$elapsedtime+startDate 
    x<-x[,-c(7,8)] #remove the alarms and errors variables 
    names(x$elapsedtime)<-"datetime" #rename timestamp to datetime 
    return(x) 
} 

read.dtrak("**INSERT FILE PATH HERE**") 
+1

이것은 매우 복잡하고 많은 질문을하고 있습니다.이 질문을 * POSIX 변환에 중점을 둔 * 단일 문제 *로 수정하는 것이 좋습니다. 귀하의 질문에 더 집중하면 도움을받을 수있을 것이라고 생각합니다. (심지어 Ptrak 데이터도 언급하고 있는데, 그보다는 덜 포함하고 있습니까?) – Gregor

+0

귀하의 의견에 감사드립니다. 나는 먼지 트랙 데이터를 조작 할 때 다른 사람들이 사용할 프레임 워크를 제공하기 위해 문제에 대한 나의 일반적인 접근법을 설명하는 방법으로 ptrak 함수를 포함하고자했다. 고맙게도 Dave2e는 나와 비슷한 파장에 있었고 영리한 솔루션을 제공 할 수있었습니다. 자신의 솔루션을 함수로 변환하는 원래 게시물 내의 편집에 대한 전체 솔루션을 추가했습니다! – spacedSparking

답변

1

각 파일의 헤더에 일정한 줄 수가 있다고 가정 할 때 이것은 매우 간단한 문제입니다. POSIXct 객체는 시작 이후의 초 수입니다. 데이터가 초 단위이기 때문에 시작 시간에 경과 시간을 추가하는 것입니다.

두 줄의 시작 날짜와 시간을 읽었습니다. 값을 함께 붙여 넣고 datetime 객체로 변환 한 다음 나머지 데이터를 읽습니다. 경과 시간을 시작 시간에 추가 했으므로 가볼만합니다.

#pratice<-readLines("dusttrak_data.csv") 
#get start time and date then convert to POSIXct object 
stime<-read.csv("dusttrak_data.csv", header = FALSE, nrow=1, skip=6) 
sdate<-read.csv("dusttrak_data.csv", header = FALSE, nrow=1, skip=7) 

#read data, and add elasped time to start time 
startDate<-as.POSIXct(paste(sdate$V2, stime$V2), "%m/%d/%Y %I:%M:%S %p", tz="EST") 
df<-sdate<-read.csv("dusttrak_data.csv", skip=36) 
names(df)<-c("elapsedtime", "PM1", "PM2.5", "PM4", "PM10", "TOTAL", "Alarms", "Errors") 
df$elapsedtime<-df$elapsedtime+startDate 
#removed columns 7 and 8 
df<-df[,-c(7:8)] 

센서 시간과 일치 시키려면 as.POSIXct 함수에서 시간대를 조정해야합니다.

+0

답장을 보내 주셔서 감사합니다. 난 당신의 코드를 정확히 따라 왔고 어떤 에러도 발생하지 않지만 나의 "경과 시간"벡터는 NA로 채워진다. 나는 posix 문자열뿐만 아니라 timezone 인수로 놀고있다. 그러나 나는 지금까지 아무런 운이 없었다. 처음에는이 문제가 발생 했습니까? – spacedSparking

+0

내 작업 공간에서 다운로드 한 파일을 복사하여 붙여 넣었습니다. startDate가 올바른지 확인합니다. 시간대가 올바르지 않으면 NA로 이어지는 경고를 생성 할 수 있습니다. – Dave2e

+0

몇 가지 사소한 수정으로 코드가 저장되었습니다! 매우 감사! 나는 다음을 변경해야했다 :'df <-read.csv ("** INSERT FILE PATH **", skip = 36, stringsAsFactors = FALSE)''와''skip = 7''을 sdate로,'skip = 8 'stime. – spacedSparking