日期格式化空气质量数据的功能编程

时间:2017-03-03 23:21:31

标签: r timestamp posix date-formatting particles

对编程不熟悉的环境科学研究员,对我很轻松!

我有两种空气质量仪器(尘埃带和ptrak),它们记录数据并将它们存储为.csv文件。我的目标是通过功能编程自动化数据清理过程。每个仪器以不同的时间间隔记录(30秒对1秒),每个仪器都有一个唯一的标题。

我已经有一个读取ptrak数据的函数。它删除令人讨厌的标题并将日期和时间列转换为as.POSIX日期时间。结果是一个新的宽格式数据帧,只有两列,日期时间和粒子数浓度(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和TOTAL(参见dusttrak_data.csv)。

提前道歉,不包括帖子中的样本数据。我无法弄清楚如何创建包含那些讨厌的标题的样本数据!

找到这个问题的答案基本上可以节省我100个小时的手动数据清理工作,所以我非常感谢您的见解!

以下是数据: PtrakDusttrak 编辑:将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 个答案:

答案 0 :(得分: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函数中的时区以匹配传感器时间。