Функциональное программирование для форматирования даты данных о качестве воздуха

Исследователь-эколог, новичок в программировании, полегче со мной!

У меня есть два прибора для контроля качества воздуха (пылесос и птрак), которые регистрируют данные и сохраняют их в виде файлов .csv. Моя цель — автоматизировать процесс очистки данных с помощью функционального программирования. Каждый инструмент записывает в разные промежутки времени (30 секунд против 1 секунды), и каждый инструмент имеет уникальный заголовок.

У меня уже есть функция, которая считывает данные ptrak. Он удаляет неприятный заголовок и преобразует столбцы даты и времени в один как .POSIX datetime. Результатом является новый широкоформатный фрейм данных только с двумя столбцами: дата-время и концентрация числа частиц (pnc).

Вот функция ptrak:

## 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!

У меня проблемы с данными пылесборника. Вместо того, чтобы иметь столбец даты и времени для каждого наблюдения, мне предоставляется только время начала, которое находится в заголовке. Фактический кадр данных предоставляет только общее прошедшее время с 30-секундными интервалами с этого времени начала. Я хочу создать новый кадр данных с временной меткой POSIX и пятью массовыми концентрациями частиц (см. ниже), которые я могу позже объединить по дате и времени с ptrak. Может ли кто-нибудь предоставить функцию, которая использует время начала и прошедшее время для создания нового вектора даты и времени, а затем удаляет заголовок, чтобы у меня остался широкоформатный фрейм данных с двумя столбцами?

Вот моя первая попытка очистки данных от пыли:

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)
}

Конечная цель состоит в том, чтобы создать очищенный фрейм данных, аналогичный данным ptrak, за исключением того, что вместо отчета о концентрации одного числа частиц (pnc) должны быть PM1, PM2,5, PM4, PM10 и ИТОГО (см. dusttrak_data.csv ).

Заранее приносим извинения за то, что не включили примеры данных в пост. Я не мог понять, как создать образец данных, включающий эти надоедливые заголовки!

Поиск ответа на этот вопрос сэкономил бы мне +100 часов ручной очистки данных, поэтому я очень ценю ваше понимание!

Вот данные: Ptrak, Dusttrak EDIT: преобразование решения 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**")

person philiporlando    schedule 03.03.2017    source источник
comment
Это очень сложно и требует многого прямо сейчас. Я бы посоветовал вам отредактировать этот вопрос до одной проблемы, возможно, сфокусировавшись на одном преобразовании POSIX. Я думаю, вы добьетесь большего успеха в получении помощи, если ваш вопрос будет более целенаправленным (уместно ли даже упоминание данных Ptrak, а тем более их включение?)   -  person Gregor Thomas    schedule 04.03.2017
comment
Я ценю ваш вклад. Я хотел включить функцию ptrak, чтобы проиллюстрировать мой общий подход к проблеме, в надежде предоставить основу для использования другими при манипулировании данными пылеудаления. К счастью, Dave2e был на той же волне, что и я, и смог предложить разумное решение. Я добавил полное решение к редактированию в своем исходном сообщении, превратив его решение в функцию!   -  person philiporlando    schedule 04.03.2017


Ответы (1)


Это довольно простая проблема, если предположить, что каждый файл имеет постоянное количество строк в заголовке. Объект POSIXct представляет собой количество секунд с начала. Поскольку ваши данные представлены в секундах, нужно просто добавить прошедшее время к времени начала.

Я прочитал две строки с датой и временем начала. Вставил значения вместе и преобразовал в объект даты и времени, а затем прочитал оставшиеся данные. Добавил прошедшее время к времени начала, и все готово.

#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, чтобы он соответствовал времени датчиков.

person Dave2e    schedule 03.03.2017
comment
Спасибо за ответ. Я точно следовал вашему коду, и хотя он не выдает никаких ошибок, мой вектор истекшего времени заполнен NA. Я играю с аргументом часового пояса, а также со строкой символов posix, но пока мне не повезло. Вы тоже столкнулись с этой проблемой изначально? - person philiporlando; 04.03.2017
comment
Я скопировал и вставил это со своего рабочего места, работая со скачанным файлом. Я бы проверил правильность startDate. Если часовой пояс неверен, он может генерировать предупреждения, что приведет к NA. - person Dave2e; 04.03.2017
comment
С небольшими изменениями ваш код спас положение! Очень признателен! Мне нужно было изменить следующее: df<-read.csv("**INSERT FILE PATH**", skip = 36, stringsAsFactors = FALSE), а также у меня было skip = 7 для sdate и skip=8 для stime. - person philiporlando; 04.03.2017