From e6a302ba97e1572cc496d18514b2b8dd8e4682ee Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Thu, 26 Sep 2024 10:48:00 +0200 Subject: [PATCH 01/25] migrate function for reading ActiGraph csv from GGIR to GGIRread #68 --- DESCRIPTION | 2 +- NAMESPACE | 8 +- NEWS.md | 1 + R/readActiGraphCount.R | 176 +++ inst/testfiles/ActiGraph13.csv | 1000 ++++++++++++++++ .../ActiGraph13_timestamps_headers.csv | 1011 +++++++++++++++++ inst/testfiles/ActiGraph61.csv | 1000 ++++++++++++++++ man/readActiGraphCount.Rd | 37 + tests/testthat/test_readActiGraphCount.R | 66 ++ 9 files changed, 3298 insertions(+), 3 deletions(-) create mode 100644 R/readActiGraphCount.R create mode 100644 inst/testfiles/ActiGraph13.csv create mode 100644 inst/testfiles/ActiGraph13_timestamps_headers.csv create mode 100644 inst/testfiles/ActiGraph61.csv create mode 100644 man/readActiGraphCount.Rd create mode 100644 tests/testthat/test_readActiGraphCount.R diff --git a/DESCRIPTION b/DESCRIPTION index 5044519..0536150 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,7 +22,7 @@ URL: https://github.com/wadpac/GGIRread/ BugReports: https://github.com/wadpac/GGIRread/issues License: Apache License (== 2.0) Suggests: testthat -Imports: matlab, bitops, Rcpp (>= 0.12.10) +Imports: matlab, bitops, Rcpp (>= 0.12.10), data.table Depends: stats, utils, R (>= 3.5.0) NeedsCompilation: yes LinkingTo: Rcpp diff --git a/NAMESPACE b/NAMESPACE index b1cd31b..f5834ae 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,9 @@ -export(readGenea, readAxivity, readGENEActiv, GENEActivReader, resample, readWav) +export(readGenea, readAxivity, readGENEActiv, + GENEActivReader, resample, readWav, + readActiGraphCount) useDynLib(GGIRread, .registration = TRUE) importFrom(Rcpp, sourceCpp) +importFrom(data.table, fread) importFrom("utils", "setTxtProgressBar", "txtProgressBar") -importFrom("utils", "read.csv") \ No newline at end of file +importFrom("utils", "read.csv") +importFrom("utils", "available.packages") \ No newline at end of file diff --git a/NEWS.md b/NEWS.md index acb326b..0f48dfd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ - Added a `NEWS.md` file to track changes to the package. - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. +- Migrate read function for ActiGraph count data (csv) to GGIRread #68. # Changes in version 1.0.1 (release date:03-06-2024) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R new file mode 100644 index 0000000..4f3c3d7 --- /dev/null +++ b/R/readActiGraphCount.R @@ -0,0 +1,176 @@ +readActiGraphCount = function(filename = file, desiredEpochSize = NULL, + timeformat = "%m/%d/%Y %H:%M:%S", tz = "") { + deviceSerialNumber = NULL + # Test if file has header by reading first ten rows + # and checking whether it contains the word + # serial number. + headerAvailable = FALSE + header = data.table::fread( + input = filename, + header = FALSE, + nrows = 10, + data.table = FALSE, + sep = "," + ) + if (nrow(header) < 10) { + stop(paste0("File ", filename, " cannot be processed because it has less than ten rows")) + } + splitHeader = function(x) { + tmp = unlist(strsplit(x, " ")) + item = gsub( + pattern = ":| ", + replacement = "", + x = paste0(tmp[1:(length(tmp) - 1)], collapse = "") + ) + df = data.frame(item = tolower(item), value = tmp[length(tmp)]) + return(df) + } + fileHeader = NULL + for (hh in header[2:9,1]) { + fileHeader = rbind(fileHeader, splitHeader(hh)) + } + if (any(grepl("serialnumber", fileHeader$item))) headerAvailable = TRUE + + # Depending on whether header is present assign number of rows to skip: + if (headerAvailable == TRUE) { + skip = 10 + } else { + tmp = data.table::fread(input = filename, + header = FALSE, + data.table = FALSE, + skip = 0, + nrows = 1) + if (any(grepl("data|scoring", tmp[1,]))) { + skip = 1 + } else { + skip = 0 + } + } + + # Check if file was exported with column names: + colnames = FALSE + colnames_test = data.table::fread(input = filename, + header = FALSE, + data.table = FALSE, + skip = skip, + nrows = 1) + if (any(grepl("Axis|vector magnitude|vm", colnames_test[1,], ignore.case = TRUE))) { + colnames = TRUE + } + # Increment skip if column names are present + Dtest = data.table::fread(input = filename, + header = colnames, + data.table = FALSE, + skip = skip, nrows = 1) + if (length(grep(pattern = "time|date", x = Dtest[1, 1], ignore.case = TRUE)) > 0) { + skip = skip + 1 + } + # Read all data from file + D = data.table::fread(input = filename, + header = colnames, + data.table = FALSE, + skip = skip) + + # Ignore time and date column if present + D = D[, grep(pattern = "time|date", x = Dtest[1, ], ignore.case = TRUE, invert = TRUE), drop = FALSE] + D = D[, grep(pattern = "time|date", x = colnames(Dtest), ignore.case = TRUE, invert = TRUE), drop = FALSE] + if (inherits(x = D[1,1], what = "POSIXt")) { + D = D[, -1, drop = FALSE] + } + # Identify columns with count data + acccol = vmcol = NA + if (colnames == TRUE) { + acccol = grep("axis|activity", colnames(D), ignore.case = TRUE) + vmcol = grep("vector magnitude|vm", colnames(D), ignore.case = TRUE) + } else { + # Then assume first 3 columns are axis1, axis2, axis3 if ncol(D) >= 3 + # First column is VM if ncol(D) < 3 + # Note that in ActiLife software the user can select + # the columns to export (e.g, it could be "Axis1", "Vector Magnitude", "Steps") + # which may mean that our assumptions here are not necessarily true. + if (ncol(D) >= 3) { + acccol = 1:3 + } else { + vmcol = 1 + } + } + # Assign colnames and formatting + if (is.na(acccol[1]) == FALSE) { + colnames(D)[acccol] = c("y", "x", "z") # ActiGraph always stores y axis first + } + if (is.na(vmcol[1]) == FALSE) { + D = as.matrix(D, drop = FALSE) # Convert to matrix as data.frame will auto-collapse to vector + colnames(D)[vmcol] = c("vm") + } + keep = c(acccol, vmcol)[!is.na(c(acccol, vmcol))] + D = D[, keep, drop = FALSE] + if (ncol(D) == 3 & is.na(vmcol)) { + D$vm = sqrt(D[,1]^2 + D[,2]^2 + D[,3]^2) + } + # Extract information from header, if present + if (headerAvailable == TRUE) { + deviceSerialNumber = fileHeader$value[grep(pattern = "serialnumber", x = fileHeader$item)] + epochSize = fileHeader$value[grep(pattern = "epochperiod|cycleperiod", x = fileHeader$item)] + epSizeShort = sum(as.numeric(unlist(strsplit(epochSize, ":"))) * c(3600, 60, 1)) + starttime = fileHeader$value[grep(pattern = "starttime", x = fileHeader$item)] + startdate = fileHeader$value[grep(pattern = "startdate", x = fileHeader$item)] + timestamp = paste0(startdate, " ", starttime) + timestamp_POSIX = as.POSIXlt(timestamp, tz = tz, + format = timeformat) + } else if (headerAvailable == FALSE) { + # Extract date/timestamp from first values of column + tmp = data.table::fread(input = filename, + header = colnames, + data.table = FALSE, + skip = skip, + nrows = 2) + if (colnames == TRUE) { + datecol = grep("date", colnames(tmp), ignore.case = TRUE) + timecol = grep("time|epoch", colnames(tmp), ignore.case = TRUE) + time = tmp[, timecol] + date = tmp[, datecol] + + starttime = time[1] + starttime = date[1] + timestamp = paste0(date, " ", time) + format = timeformat + timestamp_POSIX = as.POSIXlt(timestamp, tz = tz, format = format) + if (all(is.na(timestamp_POSIX))) { + stop(paste0("\nTimestamps are not available in the file, neither has", + " it a header to extract the timestamps from. Therefore, the file", + " cannot be processed.\n")) + } + epochSize = difftime(timestamp_POSIX[2], timestamp_POSIX[1], + units = "secs") + epSizeShort = as.numeric(epochSize) + timestamp_POSIX = timestamp_POSIX[1] # startTime + } + } + # Check timestamp is meaningful + if (all(is.na(timestamp_POSIX))) { + stop(paste0("\nTime format in data ", timestamp, " does not match with time format ", + timeformat, + " as specified by argument extEpochData_timeformat, please correct.\n")) + } + # If requested, aggregate data to lower resolution to match desired + # epoch size in argument windowsizes + if (!is.null(desiredEpochSize)) { + if (desiredEpochSize > epSizeShort) { + step = desiredEpochSize %/% epSizeShort + D = rbind(rep(0, ncol(D)), D) + D = apply(D, 2, cumsum) + D = D[seq(1, nrow(D), by = step), , drop = FALSE] + D = apply(D, 2, diff) + epSizeShort = epSizeShort * step + } + if (epSizeShort != desiredEpochSize) { + stop(paste0("\nThe short epoch size as specified by the user as the first value of argument windowsizes (", + desiredEpochSize, + " seconds) does NOT match the short epoch size we see in the data (", epSizeShort), + " seconds). Please correct.", call. = FALSE) + } + } + invisible(list(data = D, epochSize = epSizeShort, + startTime = timestamp_POSIX, + deviceSerialNumber = deviceSerialNumber)) +} \ No newline at end of file diff --git a/inst/testfiles/ActiGraph13.csv b/inst/testfiles/ActiGraph13.csv new file mode 100644 index 0000000..3b1d0ab --- /dev/null +++ b/inst/testfiles/ActiGraph13.csv @@ -0,0 +1,1000 @@ +------------ Data File Created By ActiGraph wGT3XPlus ActiLife v6.10.2 Firmware v2.2.1 date format M/d/yyyy Filter Normal -----------,,, +Serial Number: CLE2A2123456,,, +Start Time 09:00:00,,, +Start Date 8/26/2013,,, +Epoch Period (hh:mm:ss) 00:00:15,,, +Download Time 12:54:04,,, +Download Date 9/3/2013,,, +Current Memory Address: 0,,, +Current Battery Voltage: 4.03 Mode = 13,,, +--------------------------------------------------,,, +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +36,0,85,1 +0,0,13,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +1,0,107,0 +0,0,5,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,34,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +39,0,69,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +52,28,178,0 +0,0,0,0 +47,23,106,2 +847,756,836,8 +95,171,34,1 +1132,986,1258,11 +375,256,480,5 +335,204,541,4 +204,161,163,1 +455,836,242,6 +0,9,34,0 +1062,827,1100,9 +170,68,77,8 +47,112,45,2 +16,5,4,1 +332,358,496,8 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +911,1675,1468,7 +658,1371,1331,8 +196,68,489,1 +0,58,8,0 +0,22,50,0 +469,308,587,11 +837,183,313,2 +850,50,319,4 +330,202,174,3 +339,132,178,1 +186,201,567,4 +296,542,389,5 +129,401,400,1 +28,180,188,1 +7,11,11,1 +2,7,10,0 +0,0,0,0 +0,0,0,0 +92,61,155,2 +0,0,5,0 +127,96,217,2 +47,36,75,1 +0,0,0,0 +81,38,75,1 +0,57,133,0 +0,0,0,0 +0,0,0,0 +0,0,6,0 +0,0,12,0 +0,0,0,0 +84,20,71,1 +2,7,43,0 +16,6,48,0 +0,28,23,0 +0,0,0,0 +26,15,60,1 +21,36,19,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,3,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +20,0,0,1 +32,7,39,1 +101,24,38,1 +72,0,78,1 +0,8,13,0 +6,38,51,0 +309,655,872,6 +51,106,152,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,46,0,0 +0,0,0,0 +0,0,0,0 +0,5,0,0 +0,0,0,0 +0,0,0,0 +0,12,33,0 +0,0,0,0 +37,76,84,1 +0,0,0,0 +6,54,124,0 +0,1,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,6,0,0 +0,0,0,0 +0,4,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,14,0,0 +0,0,0,0 +0,0,0,0 +0,102,12,0 +0,27,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,12,0,0 +0,2,25,0 +0,0,0,0 +0,0,6,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,15,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,40,0,0 +0,10,0,0 +561,48,157,3 +13,12,33,0 +0,75,43,0 +0,0,0,0 +0,36,2,0 +0,0,0,0 +98,153,225,3 +235,335,523,7 +0,0,0,0 +24,24,29,1 +0,0,0,0 +0,0,0,0 +40,57,93,2 +74,124,323,1 +0,8,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,2,0,0 +0,0,0,0 +58,82,286,2 +0,0,0,0 +0,0,0,0 +2,96,60,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,1,0,0 +0,0,0,0 +0,2,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,6,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +29,10,81,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,9,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +1,14,7,0 +0,0,0,0 +0,0,0,0 +6,6,8,1 +0,0,0,0 +0,0,0,0 +0,0,7,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,17,0,0 +2,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +52,2,42,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +16,0,13,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,9,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +13,0,13,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,21,2,0 +0,0,4,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +15,5,6,1 +0,0,0,0 +2,0,0,0 +0,0,0,0 +0,0,0,0 +0,4,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +66,16,140,2 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,14,0 +0,0,0,0 +0,0,2,0 +6,11,15,0 +36,6,17,0 +0,0,0,0 +0,0,0,0 +36,45,151,2 +0,0,0,0 +0,0,29,0 +24,90,97,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +104,177,220,2 +0,10,12,0 +0,12,9,0 +0,0,15,0 +0,0,25,0 +0,12,30,0 +118,259,475,5 +312,276,312,10 +1236,510,551,27 +1146,505,536,28 +1265,411,481,28 +1122,497,913,26 +1366,439,744,27 +1420,404,513,27 +1011,310,482,26 +126,108,296,3 +0,4,0,0 +0,0,0,0 +0,0,0,0 +40,3,36,2 +0,0,0,0 +632,746,1096,13 +226,252,444,7 +205,178,532,4 +19,204,269,2 +488,522,1006,13 +177,259,500,9 +440,433,1262,11 +569,516,1082,11 +45,183,104,1 +75,114,504,3 +168,267,630,4 +658,422,1254,11 +304,317,1011,7 +429,567,725,6 +412,395,723,10 +80,168,403,2 +269,356,571,7 +97,215,381,3 +66,217,402,3 +183,317,435,8 +448,608,879,11 +128,209,515,5 +11,156,202,0 +275,234,612,4 +138,266,556,5 +200,163,444,3 +298,449,1000,6 +201,396,895,7 +202,595,1084,7 +209,674,787,10 +408,281,826,12 +41,364,327,3 +120,319,400,6 +384,179,423,10 +308,332,871,8 +55,333,339,1 +1,14,24,0 +158,304,531,5 +0,0,0,0 +367,320,460,11 +15,72,117,0 +0,2,21,0 +0,0,0,0 +98,351,285,3 +9,44,28,1 +65,197,265,1 +0,0,0,0 +13,49,49,0 +0,31,36,0 +0,26,52,0 +0,0,0,0 +225,196,338,4 +492,427,619,14 +283,139,522,15 +204,221,470,10 +539,266,669,19 +923,347,577,25 +1146,312,439,26 +1102,377,477,28 +999,384,556,26 +673,250,510,17 +0,70,190,0 +1,109,185,0 +133,65,333,8 +10,44,204,0 +228,276,533,9 +101,226,476,4 +50,97,148,1 +32,77,133,1 +34,98,279,1 +0,10,14,0 +0,41,19,0 +0,0,0,0 +14,70,57,1 +1551,61,869,2 +0,11,28,0 +0,0,0,0 +0,13,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,30,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,12,6,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,21,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,5,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,121,0 +0,0,0,0 +0,0,0,0 +0,0,44,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,19,0 +0,0,0,0 +0,26,19,0 +0,0,0,0 +0,0,20,0 +0,0,0,0 +31,89,88,0 +0,0,5,0 +0,19,50,0 +0,5,0,0 +0,0,0,0 +12,13,18,0 +0,46,57,0 +0,19,18,0 +2,16,164,1 +0,0,0,0 +0,7,0,0 +0,0,0,0 +0,0,0,0 +7,0,80,0 +0,0,0,0 +0,0,0,0 +0,7,0,0 +0,0,0,0 +0,0,0,0 +0,6,22,0 +0,0,0,0 +0,32,16,0 +0,0,3,0 +7,13,38,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +49,72,134,1 +0,61,0,0 +224,156,192,2 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,1,0,0 +0,0,0,0 +0,183,110,0 +0,0,0,0 +0,9,0,0 +0,41,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,4,41,0 +0,2,27,0 +0,0,0,0 +0,2,28,0 +0,9,19,0 +15,34,64,1 +126,135,137,2 +7,37,33,0 +25,85,82,1 +10,7,6,1 +0,9,31,0 +0,0,13,0 +0,16,0,0 +0,12,125,0 +0,2,0,0 +0,0,0,0 +8,108,139,0 +0,0,16,0 +0,15,2,0 +0,14,20,0 +0,0,0,0 +0,2,14,0 +0,51,23,0 +0,105,5,0 +0,19,0,0 +0,0,0,0 +0,0,10,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,34,0 +0,0,6,0 +0,0,8,0 +0,7,0,0 +3,3,34,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +118,77,136,0 +0,0,0,0 +10,19,48,1 +0,4,16,0 +0,0,0,0 +10,30,100,0 +8,54,147,0 +0,0,0,0 +0,2,1,0 +0,11,0,0 +0,0,0,0 +0,2,0,0 +0,4,0,0 +0,0,0,0 +3,29,9,1 +0,0,9,0 +0,12,94,0 +0,0,0,0 +0,0,17,0 +23,8,30,0 +6,15,0,1 +18,69,58,1 +0,0,0,0 +0,15,6,0 +0,0,2,0 +0,18,3,0 +13,33,22,1 +0,11,11,0 +0,0,0,0 +0,48,45,0 +0,0,0,0 +0,17,27,0 +0,7,4,0 +2,31,0,0 +0,0,0,0 +44,47,113,1 +2,8,27,1 +0,55,11,0 +4,77,122,0 +0,0,10,0 +47,18,64,0 +209,361,148,3 +43,108,117,3 +0,0,0,0 +117,239,235,2 +0,0,22,0 +7,20,26,0 +1,0,12,1 +0,10,3,0 +0,0,0,0 +0,0,0,0 +0,10,30,0 +0,0,12,0 +0,2,16,0 +0,0,0,0 +0,18,0,0 +21,0,5,0 +12,19,16,1 +71,66,25,1 +0,0,0,0 +0,0,0,0 +0,6,5,0 +0,0,5,0 +0,5,0,0 +0,6,0,0 +0,0,0,0 +30,37,54,1 +0,0,0,0 +0,15,7,0 +0,0,0,0 +0,0,0,0 +0,0,1,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +79,24,152,1 +77,56,93,2 +0,30,27,0 +15,94,136,1 +0,0,0,0 +0,34,6,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,7,0,0 +0,0,0,0 +0,50,31,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,6,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +13,3,49,1 +0,0,10,0 +90,197,181,1 +79,301,439,4 +653,235,547,21 +687,270,580,22 +563,296,735,20 +892,287,617,24 +894,256,652,23 +839,318,609,25 +1106,369,633,26 +282,439,470,8 +0,75,102,0 +72,169,360,5 +157,151,513,8 +281,481,524,9 +320,309,559,8 +106,157,215,1 +34,14,5,1 +24,9,21,1 +77,113,72,2 +0,0,0,0 +0,3,0,0 +39,115,97,1 +79,194,142,2 +32,178,13,2 +0,0,0,0 +0,8,0,0 +0,0,0,0 +75,71,42,1 +188,177,129,3 +0,2,0,0 +16,24,4,1 +0,0,0,0 +208,285,361,2 +180,110,100,3 +0,0,0,0 +0,0,0,0 +13,2,0,1 +12,17,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +12,0,0,1 +0,0,0,0 +19,0,0,1 +2,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +42,50,0,1 +0,0,0,0 +0,0,0,0 +0,9,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +38,7,5,0 +18,0,9,1 +10,0,0,0 +0,4,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +24,0,0,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,2,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +11,10,0,0 +0,0,0,0 +8,0,0,0 +12,0,0,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +6,0,0,1 +42,0,0,2 +0,0,0,0 +6,0,0,0 +0,0,0,0 +0,0,0,0 +2,0,0,0 +0,0,0,0 +26,0,2,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +15,0,0,1 +0,0,0,0 +0,0,0,0 +26,0,4,1 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +0,0,0,0 +6,0,0,0 +0,0,0,0 +8,0,0,1 +262,188,298,4 +78,144,248,1 +22,68,152,2 +36,66,86,0 diff --git a/inst/testfiles/ActiGraph13_timestamps_headers.csv b/inst/testfiles/ActiGraph13_timestamps_headers.csv new file mode 100644 index 0000000..8c3145b --- /dev/null +++ b/inst/testfiles/ActiGraph13_timestamps_headers.csv @@ -0,0 +1,1011 @@ +------------ Data Table File Created By Actigraph Link ActiLife v6.11.9 date format dd/MM/yyyy Filter Normal -----------,,,,, +Serial Number: TAS1D48140206,,,,, +Start Time 15:00:00,,,,, +Start Date 09-12-2017,,,,, +Epoch Period (hh:mm:ss) 00:00:01,,,,, +Download Time 15:29:44,,,,, +Download Date 09-19-2017,,,,, +Current Memory Address: 0,,,,, +Current Battery Voltage: 3.85 Mode = 13,,,,, +--------------------------------------------------,,,,, +TimeStamp,axis1,axis2,axis3,steps,vm +2017-09-12T15:00:00Z,0,0,0,0,0 +2017-09-12T15:00:01Z,44,9,0,0,45 +2017-09-12T15:00:02Z,113,9,29,1,118 +2017-09-12T15:00:03Z,28,0,43,0,52 +2017-09-12T15:00:04Z,53,3,41,0,68 +2017-09-12T15:00:05Z,61,91,100,1,149 +2017-09-12T15:00:06Z,3,24,42,0,49 +2017-09-12T15:00:07Z,108,128,227,0,283 +2017-09-12T15:00:08Z,51,49,97,1,121 +2017-09-12T15:00:09Z,33,20,93,0,101 +2017-09-12T15:00:10Z,70,0,4,0,71 +2017-09-12T15:00:11Z,25,0,0,0,25 +2017-09-12T15:00:12Z,42,9,19,0,47 +2017-09-12T15:00:13Z,88,28,60,1,111 +2017-09-12T15:00:14Z,3,0,0,0,3 +2017-09-12T15:00:15Z,8,0,0,0,8 +2017-09-12T15:00:16Z,0,0,0,0,0 +2017-09-12T15:00:17Z,0,0,0,0,0 +2017-09-12T15:00:18Z,0,0,0,0,0 +2017-09-12T15:00:19Z,0,0,0,0,0 +2017-09-12T15:00:20Z,0,0,0,0,0 +2017-09-12T15:00:21Z,0,0,0,0,0 +2017-09-12T15:00:22Z,0,0,0,0,0 +2017-09-12T15:00:23Z,0,0,0,0,0 +2017-09-12T15:00:24Z,0,0,0,0,0 +2017-09-12T15:00:25Z,0,0,0,0,0 +2017-09-12T15:00:26Z,0,0,0,0,0 +2017-09-12T15:00:27Z,0,0,0,0,0 +2017-09-12T15:00:28Z,0,0,0,0,0 +2017-09-12T15:00:29Z,0,0,0,0,0 +2017-09-12T15:00:30Z,0,0,0,0,0 +2017-09-12T15:00:31Z,0,0,0,0,0 +2017-09-12T15:00:32Z,0,0,0,0,0 +2017-09-12T15:00:33Z,0,0,0,0,0 +2017-09-12T15:00:34Z,0,0,0,0,0 +2017-09-12T15:00:35Z,0,0,0,0,0 +2017-09-12T15:00:36Z,0,0,0,0,0 +2017-09-12T15:00:37Z,0,0,0,0,0 +2017-09-12T15:00:38Z,0,0,0,0,0 +2017-09-12T15:00:39Z,0,0,0,0,0 +2017-09-12T15:00:40Z,0,0,0,0,0 +2017-09-12T15:00:41Z,0,0,0,0,0 +2017-09-12T15:00:42Z,60,0,21,1,64 +2017-09-12T15:00:43Z,8,0,0,0,8 +2017-09-12T15:00:44Z,0,0,0,0,0 +2017-09-12T15:00:45Z,0,0,0,0,0 +2017-09-12T15:00:46Z,0,0,0,0,0 +2017-09-12T15:00:47Z,0,0,0,0,0 +2017-09-12T15:00:48Z,0,0,0,0,0 +2017-09-12T15:00:49Z,17,0,0,0,17 +2017-09-12T15:00:50Z,0,0,0,0,0 +2017-09-12T15:00:51Z,0,0,0,0,0 +2017-09-12T15:00:52Z,0,0,0,0,0 +2017-09-12T15:00:53Z,13,0,0,0,13 +2017-09-12T15:00:54Z,7,0,0,0,7 +2017-09-12T15:00:55Z,0,0,0,0,0 +2017-09-12T15:00:56Z,0,0,0,0,0 +2017-09-12T15:00:57Z,0,0,0,0,0 +2017-09-12T15:00:58Z,0,0,0,0,0 +2017-09-12T15:00:59Z,0,0,0,0,0 +2017-09-12T15:01:00Z,0,0,0,0,0 +2017-09-12T15:01:01Z,0,0,0,0,0 +2017-09-12T15:01:02Z,0,0,0,0,0 +2017-09-12T15:01:03Z,0,0,0,0,0 +2017-09-12T15:01:04Z,0,0,0,0,0 +2017-09-12T15:01:05Z,0,0,0,0,0 +2017-09-12T15:01:06Z,0,0,0,0,0 +2017-09-12T15:01:07Z,0,0,0,0,0 +2017-09-12T15:01:08Z,0,0,0,0,0 +2017-09-12T15:01:09Z,0,0,0,0,0 +2017-09-12T15:01:10Z,0,0,0,0,0 +2017-09-12T15:01:11Z,0,0,0,0,0 +2017-09-12T15:01:12Z,0,0,0,0,0 +2017-09-12T15:01:13Z,0,0,0,0,0 +2017-09-12T15:01:14Z,0,0,0,0,0 +2017-09-12T15:01:15Z,0,0,0,0,0 +2017-09-12T15:01:16Z,0,0,0,0,0 +2017-09-12T15:01:17Z,0,0,0,0,0 +2017-09-12T15:01:18Z,0,0,0,0,0 +2017-09-12T15:01:19Z,0,0,0,0,0 +2017-09-12T15:01:20Z,0,0,0,0,0 +2017-09-12T15:01:21Z,0,0,0,0,0 +2017-09-12T15:01:22Z,9,0,0,1,9 +2017-09-12T15:01:23Z,0,0,0,0,0 +2017-09-12T15:01:24Z,0,0,0,0,0 +2017-09-12T15:01:25Z,0,0,0,0,0 +2017-09-12T15:01:26Z,0,0,0,0,0 +2017-09-12T15:01:27Z,0,0,0,0,0 +2017-09-12T15:01:28Z,0,0,0,0,0 +2017-09-12T15:01:29Z,0,0,0,0,0 +2017-09-12T15:01:30Z,0,0,0,0,0 +2017-09-12T15:01:31Z,0,0,0,0,0 +2017-09-12T15:01:32Z,0,0,0,0,0 +2017-09-12T15:01:33Z,0,0,0,0,0 +2017-09-12T15:01:34Z,0,0,0,0,0 +2017-09-12T15:01:35Z,0,0,0,0,0 +2017-09-12T15:01:36Z,0,0,0,0,0 +2017-09-12T15:01:37Z,0,0,0,0,0 +2017-09-12T15:01:38Z,0,0,0,0,0 +2017-09-12T15:01:39Z,0,0,0,0,0 +2017-09-12T15:01:40Z,0,0,0,0,0 +2017-09-12T15:01:41Z,22,34,0,0,41 +2017-09-12T15:01:42Z,2,67,0,1,68 +2017-09-12T15:01:43Z,0,0,0,0,0 +2017-09-12T15:01:44Z,0,0,0,0,0 +2017-09-12T15:01:45Z,0,0,0,0,0 +2017-09-12T15:01:46Z,0,0,0,0,0 +2017-09-12T15:01:47Z,0,0,0,0,0 +2017-09-12T15:01:48Z,0,0,0,0,0 +2017-09-12T15:01:49Z,0,0,0,0,0 +2017-09-12T15:01:50Z,0,0,0,0,0 +2017-09-12T15:01:51Z,0,0,0,0,0 +2017-09-12T15:01:52Z,0,0,0,0,0 +2017-09-12T15:01:53Z,0,0,0,0,0 +2017-09-12T15:01:54Z,0,0,0,0,0 +2017-09-12T15:01:55Z,0,0,0,0,0 +2017-09-12T15:01:56Z,0,0,0,0,0 +2017-09-12T15:01:57Z,35,0,0,0,35 +2017-09-12T15:01:58Z,2,0,0,0,2 +2017-09-12T15:01:59Z,0,0,0,0,0 +2017-09-12T15:02:00Z,0,0,0,0,0 +2017-09-12T15:02:01Z,0,0,0,0,0 +2017-09-12T15:02:02Z,0,0,0,0,0 +2017-09-12T15:02:03Z,0,0,0,0,0 +2017-09-12T15:02:04Z,0,0,0,0,0 +2017-09-12T15:02:05Z,0,0,0,0,0 +2017-09-12T15:02:06Z,0,0,0,0,0 +2017-09-12T15:02:07Z,0,0,0,0,0 +2017-09-12T15:02:08Z,0,0,0,0,0 +2017-09-12T15:02:09Z,0,0,0,0,0 +2017-09-12T15:02:10Z,0,0,0,0,0 +2017-09-12T15:02:11Z,0,0,0,0,0 +2017-09-12T15:02:12Z,0,0,0,0,0 +2017-09-12T15:02:13Z,0,0,0,0,0 +2017-09-12T15:02:14Z,0,0,0,0,0 +2017-09-12T15:02:15Z,0,0,0,0,0 +2017-09-12T15:02:16Z,0,0,0,0,0 +2017-09-12T15:02:17Z,0,0,0,0,0 +2017-09-12T15:02:18Z,0,0,0,0,0 +2017-09-12T15:02:19Z,0,0,0,0,0 +2017-09-12T15:02:20Z,0,0,0,0,0 +2017-09-12T15:02:21Z,0,0,0,0,0 +2017-09-12T15:02:22Z,0,0,0,0,0 +2017-09-12T15:02:23Z,0,0,0,0,0 +2017-09-12T15:02:24Z,0,0,0,0,0 +2017-09-12T15:02:25Z,0,0,0,0,0 +2017-09-12T15:02:26Z,0,0,0,0,0 +2017-09-12T15:02:27Z,0,0,0,0,0 +2017-09-12T15:02:28Z,0,0,0,0,0 +2017-09-12T15:02:29Z,0,0,0,0,0 +2017-09-12T15:02:30Z,0,0,0,0,0 +2017-09-12T15:02:31Z,0,0,0,0,0 +2017-09-12T15:02:32Z,0,0,0,0,0 +2017-09-12T15:02:33Z,0,0,0,0,0 +2017-09-12T15:02:34Z,0,0,0,0,0 +2017-09-12T15:02:35Z,0,0,0,0,0 +2017-09-12T15:02:36Z,0,0,0,0,0 +2017-09-12T15:02:37Z,0,0,0,0,0 +2017-09-12T15:02:38Z,0,0,0,0,0 +2017-09-12T15:02:39Z,0,11,0,0,11 +2017-09-12T15:02:40Z,49,115,36,1,131 +2017-09-12T15:02:41Z,223,14,117,1,253 +2017-09-12T15:02:42Z,181,63,107,0,220 +2017-09-12T15:02:43Z,47,1,8,1,48 +2017-09-12T15:02:44Z,105,37,26,0,115 +2017-09-12T15:02:45Z,128,5,9,1,129 +2017-09-12T15:02:46Z,75,16,17,0,79 +2017-09-12T15:02:47Z,15,0,3,1,16 +2017-09-12T15:02:48Z,70,11,48,0,86 +2017-09-12T15:02:49Z,135,14,56,1,147 +2017-09-12T15:02:50Z,74,0,0,0,74 +2017-09-12T15:02:51Z,63,0,1,1,64 +2017-09-12T15:02:52Z,0,0,0,0,0 +2017-09-12T15:02:53Z,0,0,0,0,0 +2017-09-12T15:02:54Z,0,0,0,0,0 +2017-09-12T15:02:55Z,0,0,0,0,0 +2017-09-12T15:02:56Z,0,0,0,0,0 +2017-09-12T15:02:57Z,0,0,0,0,0 +2017-09-12T15:02:58Z,0,0,0,0,0 +2017-09-12T15:02:59Z,0,0,0,0,0 +2017-09-12T15:03:00Z,0,0,0,0,0 +2017-09-12T15:03:01Z,1,18,0,0,19 +2017-09-12T15:03:02Z,10,0,0,0,10 +2017-09-12T15:03:03Z,29,0,0,1,29 +2017-09-12T15:03:04Z,0,11,0,0,11 +2017-09-12T15:03:05Z,10,0,0,0,10 +2017-09-12T15:03:06Z,24,0,0,1,24 +2017-09-12T15:03:07Z,4,0,0,0,4 +2017-09-12T15:03:08Z,6,0,0,0,6 +2017-09-12T15:03:09Z,0,0,0,0,0 +2017-09-12T15:03:10Z,0,0,0,0,0 +2017-09-12T15:03:11Z,5,0,0,1,5 +2017-09-12T15:03:12Z,28,47,0,0,55 +2017-09-12T15:03:13Z,12,0,0,0,12 +2017-09-12T15:03:14Z,0,0,0,0,0 +2017-09-12T15:03:15Z,0,0,0,0,0 +2017-09-12T15:03:16Z,0,0,0,0,0 +2017-09-12T15:03:17Z,0,0,0,0,0 +2017-09-12T15:03:18Z,11,0,0,0,11 +2017-09-12T15:03:19Z,31,0,0,1,31 +2017-09-12T15:03:20Z,12,0,0,0,12 +2017-09-12T15:03:21Z,12,16,0,0,20 +2017-09-12T15:03:22Z,18,17,6,0,26 +2017-09-12T15:03:23Z,0,0,0,0,0 +2017-09-12T15:03:24Z,3,0,0,1,3 +2017-09-12T15:03:25Z,0,0,0,0,0 +2017-09-12T15:03:26Z,0,0,0,0,0 +2017-09-12T15:03:27Z,32,0,0,0,32 +2017-09-12T15:03:28Z,95,2,4,1,96 +2017-09-12T15:03:29Z,52,107,46,1,128 +2017-09-12T15:03:30Z,77,12,3,1,78 +2017-09-12T15:03:31Z,88,12,0,0,89 +2017-09-12T15:03:32Z,32,0,0,0,32 +2017-09-12T15:03:33Z,0,0,0,0,0 +2017-09-12T15:03:34Z,0,0,0,0,0 +2017-09-12T15:03:35Z,0,0,0,0,0 +2017-09-12T15:03:36Z,0,0,0,0,0 +2017-09-12T15:03:37Z,0,0,0,0,0 +2017-09-12T15:03:38Z,49,73,39,1,97 +2017-09-12T15:03:39Z,6,35,12,0,38 +2017-09-12T15:03:40Z,0,10,0,0,10 +2017-09-12T15:03:41Z,0,0,0,0,0 +2017-09-12T15:03:42Z,45,10,5,1,47 +2017-09-12T15:03:43Z,21,17,4,0,28 +2017-09-12T15:03:44Z,18,0,0,0,18 +2017-09-12T15:03:45Z,15,39,3,1,42 +2017-09-12T15:03:46Z,16,72,0,0,74 +2017-09-12T15:03:47Z,84,57,17,0,103 +2017-09-12T15:03:48Z,42,14,0,1,45 +2017-09-12T15:03:49Z,0,0,0,0,0 +2017-09-12T15:03:50Z,0,0,0,0,0 +2017-09-12T15:03:51Z,0,0,0,0,0 +2017-09-12T15:03:52Z,0,0,0,0,0 +2017-09-12T15:03:53Z,0,0,0,0,0 +2017-09-12T15:03:54Z,0,0,0,0,0 +2017-09-12T15:03:55Z,0,0,0,0,0 +2017-09-12T15:03:56Z,0,0,0,0,0 +2017-09-12T15:03:57Z,0,0,0,0,0 +2017-09-12T15:03:58Z,0,0,0,0,0 +2017-09-12T15:03:59Z,0,0,0,0,0 +2017-09-12T15:04:00Z,0,0,0,0,0 +2017-09-12T15:04:01Z,0,0,0,0,0 +2017-09-12T15:04:02Z,0,0,0,0,0 +2017-09-12T15:04:03Z,0,0,0,0,0 +2017-09-12T15:04:04Z,77,0,10,0,78 +2017-09-12T15:04:05Z,65,1,0,0,66 +2017-09-12T15:04:06Z,96,89,9,0,132 +2017-09-12T15:04:07Z,5,21,7,0,23 +2017-09-12T15:04:08Z,112,89,38,1,149 +2017-09-12T15:04:09Z,31,26,0,0,41 +2017-09-12T15:04:10Z,31,0,0,0,31 +2017-09-12T15:04:11Z,0,0,0,0,0 +2017-09-12T15:04:12Z,0,0,0,0,0 +2017-09-12T15:04:13Z,0,0,0,0,0 +2017-09-12T15:04:14Z,0,0,0,0,0 +2017-09-12T15:04:15Z,0,0,0,0,0 +2017-09-12T15:04:16Z,134,34,4,0,139 +2017-09-12T15:04:17Z,77,19,0,1,80 +2017-09-12T15:04:18Z,62,0,0,0,62 +2017-09-12T15:04:19Z,70,62,96,1,135 +2017-09-12T15:04:20Z,183,108,120,0,245 +2017-09-12T15:04:21Z,174,99,107,0,227 +2017-09-12T15:04:22Z,55,58,0,0,80 +2017-09-12T15:04:23Z,80,154,75,1,190 +2017-09-12T15:04:24Z,79,0,0,0,79 +2017-09-12T15:04:25Z,69,122,59,1,153 +2017-09-12T15:04:26Z,170,115,50,1,212 +2017-09-12T15:04:27Z,152,99,48,0,188 +2017-09-12T15:04:28Z,49,0,0,0,49 +2017-09-12T15:04:29Z,32,0,0,1,32 +2017-09-12T15:04:30Z,72,24,23,0,80 +2017-09-12T15:04:31Z,0,19,13,0,24 +2017-09-12T15:04:32Z,0,0,0,0,0 +2017-09-12T15:04:33Z,0,0,0,0,0 +2017-09-12T15:04:34Z,0,0,0,0,0 +2017-09-12T15:04:35Z,0,0,0,0,0 +2017-09-12T15:04:36Z,0,0,0,0,0 +2017-09-12T15:04:37Z,0,0,0,0,0 +2017-09-12T15:04:38Z,0,0,0,0,0 +2017-09-12T15:04:39Z,0,0,0,0,0 +2017-09-12T15:04:40Z,0,0,0,0,0 +2017-09-12T15:04:41Z,0,0,0,0,0 +2017-09-12T15:04:42Z,0,0,0,0,0 +2017-09-12T15:04:43Z,0,0,0,0,0 +2017-09-12T15:04:44Z,0,0,0,0,0 +2017-09-12T15:04:45Z,0,0,0,0,0 +2017-09-12T15:04:46Z,0,0,0,0,0 +2017-09-12T15:04:47Z,0,0,0,0,0 +2017-09-12T15:04:48Z,0,0,0,0,0 +2017-09-12T15:04:49Z,0,0,0,0,0 +2017-09-12T15:04:50Z,0,0,0,0,0 +2017-09-12T15:04:51Z,0,0,0,0,0 +2017-09-12T15:04:52Z,0,0,0,0,0 +2017-09-12T15:04:53Z,0,0,0,0,0 +2017-09-12T15:04:54Z,0,0,0,0,0 +2017-09-12T15:04:55Z,0,0,0,0,0 +2017-09-12T15:04:56Z,0,0,0,0,0 +2017-09-12T15:04:57Z,0,0,0,0,0 +2017-09-12T15:04:58Z,0,0,0,0,0 +2017-09-12T15:04:59Z,0,0,0,0,0 +2017-09-12T15:05:00Z,0,0,0,0,0 +2017-09-12T15:05:01Z,0,0,0,0,0 +2017-09-12T15:05:02Z,0,0,0,0,0 +2017-09-12T15:05:03Z,0,0,0,0,0 +2017-09-12T15:05:04Z,0,0,0,0,0 +2017-09-12T15:05:05Z,0,0,0,0,0 +2017-09-12T15:05:06Z,0,0,0,0,0 +2017-09-12T15:05:07Z,25,71,30,1,82 +2017-09-12T15:05:08Z,32,73,25,0,84 +2017-09-12T15:05:09Z,4,0,0,1,4 +2017-09-12T15:05:10Z,14,12,0,0,19 +2017-09-12T15:05:11Z,0,0,0,0,0 +2017-09-12T15:05:12Z,0,0,0,0,0 +2017-09-12T15:05:13Z,0,0,0,0,0 +2017-09-12T15:05:14Z,0,0,0,0,0 +2017-09-12T15:05:15Z,0,0,0,0,0 +2017-09-12T15:05:16Z,25,41,14,0,51 +2017-09-12T15:05:17Z,3,45,22,0,51 +2017-09-12T15:05:18Z,0,0,0,0,0 +2017-09-12T15:05:19Z,0,1,1,0,2 +2017-09-12T15:05:20Z,177,274,190,1,378 +2017-09-12T15:05:21Z,41,82,20,0,94 +2017-09-12T15:05:22Z,8,90,0,0,91 +2017-09-12T15:05:23Z,0,18,0,0,18 +2017-09-12T15:05:24Z,9,0,0,1,9 +2017-09-12T15:05:25Z,156,127,78,0,216 +2017-09-12T15:05:26Z,67,83,4,1,107 +2017-09-12T15:05:27Z,82,21,16,0,87 +2017-09-12T15:05:28Z,21,35,0,0,41 +2017-09-12T15:05:29Z,0,10,0,0,10 +2017-09-12T15:05:30Z,45,45,0,1,64 +2017-09-12T15:05:31Z,11,0,0,0,11 +2017-09-12T15:05:32Z,10,0,0,0,10 +2017-09-12T15:05:33Z,0,0,0,0,0 +2017-09-12T15:05:34Z,0,0,0,0,0 +2017-09-12T15:05:35Z,0,0,0,0,0 +2017-09-12T15:05:36Z,46,14,15,0,51 +2017-09-12T15:05:37Z,173,11,75,1,189 +2017-09-12T15:05:38Z,100,2,11,0,101 +2017-09-12T15:05:39Z,70,29,21,1,79 +2017-09-12T15:05:40Z,1,14,0,0,15 +2017-09-12T15:05:41Z,13,0,0,1,13 +2017-09-12T15:05:42Z,0,0,0,0,0 +2017-09-12T15:05:43Z,108,84,79,1,158 +2017-09-12T15:05:44Z,13,23,20,0,34 +2017-09-12T15:05:45Z,33,1,6,0,34 +2017-09-12T15:05:46Z,5,5,2,0,8 +2017-09-12T15:05:47Z,14,16,15,0,27 +2017-09-12T15:05:48Z,0,4,0,0,4 +2017-09-12T15:05:49Z,0,0,0,0,0 +2017-09-12T15:05:50Z,58,0,88,0,106 +2017-09-12T15:05:51Z,39,0,26,0,47 +2017-09-12T15:05:52Z,16,0,34,1,38 +2017-09-12T15:05:53Z,13,0,0,0,13 +2017-09-12T15:05:54Z,31,0,10,0,33 +2017-09-12T15:05:55Z,5,0,0,0,5 +2017-09-12T15:05:56Z,0,0,0,0,0 +2017-09-12T15:05:57Z,0,0,0,0,0 +2017-09-12T15:05:58Z,0,0,0,0,0 +2017-09-12T15:05:59Z,57,26,86,1,107 +2017-09-12T15:06:00Z,14,0,5,0,15 +2017-09-12T15:06:01Z,13,2,0,1,14 +2017-09-12T15:06:02Z,86,0,28,0,91 +2017-09-12T15:06:03Z,118,0,77,1,141 +2017-09-12T15:06:04Z,104,0,72,0,127 +2017-09-12T15:06:05Z,4,0,0,0,4 +2017-09-12T15:06:06Z,0,0,0,0,0 +2017-09-12T15:06:07Z,14,0,13,0,20 +2017-09-12T15:06:08Z,3,0,0,1,3 +2017-09-12T15:06:09Z,9,2,10,0,14 +2017-09-12T15:06:10Z,19,0,11,0,22 +2017-09-12T15:06:11Z,29,0,5,1,30 +2017-09-12T15:06:12Z,0,0,1,0,1 +2017-09-12T15:06:13Z,9,0,4,0,10 +2017-09-12T15:06:14Z,29,0,13,1,32 +2017-09-12T15:06:15Z,2,0,0,0,2 +2017-09-12T15:06:16Z,6,0,0,0,6 +2017-09-12T15:06:17Z,79,31,78,0,116 +2017-09-12T15:06:18Z,34,40,58,2,79 +2017-09-12T15:06:19Z,49,29,81,0,100 +2017-09-12T15:06:20Z,52,73,146,0,172 +2017-09-12T15:06:21Z,37,49,83,2,104 +2017-09-12T15:06:22Z,57,71,242,1,259 +2017-09-12T15:06:23Z,72,28,51,1,93 +2017-09-12T15:06:24Z,78,0,42,0,89 +2017-09-12T15:06:25Z,136,57,19,0,149 +2017-09-12T15:06:26Z,34,5,23,0,42 +2017-09-12T15:06:27Z,59,35,70,0,99 +2017-09-12T15:06:28Z,83,43,46,1,105 +2017-09-12T15:06:29Z,84,113,93,1,169 +2017-09-12T15:06:30Z,211,217,188,1,357 +2017-09-12T15:06:31Z,166,5,131,1,212 +2017-09-12T15:06:32Z,248,26,81,0,263 +2017-09-12T15:06:33Z,128,13,32,0,133 +2017-09-12T15:06:34Z,31,17,38,1,52 +2017-09-12T15:06:35Z,22,33,55,2,68 +2017-09-12T15:06:36Z,85,2,36,1,93 +2017-09-12T15:06:37Z,8,25,0,1,27 +2017-09-12T15:06:38Z,0,0,0,0,0 +2017-09-12T15:06:39Z,0,0,0,0,0 +2017-09-12T15:06:40Z,0,0,0,0,0 +2017-09-12T15:06:41Z,6,0,0,0,6 +2017-09-12T15:06:42Z,0,0,0,0,0 +2017-09-12T15:06:43Z,0,0,0,0,0 +2017-09-12T15:06:44Z,21,0,0,0,21 +2017-09-12T15:06:45Z,15,0,0,1,15 +2017-09-12T15:06:46Z,0,0,0,0,0 +2017-09-12T15:06:47Z,0,0,0,0,0 +2017-09-12T15:06:48Z,0,0,0,0,0 +2017-09-12T15:06:49Z,0,0,0,0,0 +2017-09-12T15:06:50Z,74,16,56,0,95 +2017-09-12T15:06:51Z,127,10,54,0,139 +2017-09-12T15:06:52Z,43,1,5,1,44 +2017-09-12T15:06:53Z,104,139,48,1,181 +2017-09-12T15:06:54Z,51,95,76,1,132 +2017-09-12T15:06:55Z,91,42,179,1,206 +2017-09-12T15:06:56Z,131,13,237,1,272 +2017-09-12T15:06:57Z,62,33,97,0,120 +2017-09-12T15:06:58Z,27,3,37,1,46 +2017-09-12T15:06:59Z,33,4,37,0,50 +2017-09-12T15:07:00Z,39,2,46,1,61 +2017-09-12T15:07:01Z,38,19,36,0,56 +2017-09-12T15:07:02Z,135,153,86,1,222 +2017-09-12T15:07:03Z,100,26,43,1,112 +2017-09-12T15:07:04Z,41,116,144,1,190 +2017-09-12T15:07:05Z,105,127,47,1,172 +2017-09-12T15:07:06Z,147,143,186,1,277 +2017-09-12T15:07:07Z,208,282,164,1,387 +2017-09-12T15:07:08Z,63,124,57,1,151 +2017-09-12T15:07:09Z,28,0,47,0,55 +2017-09-12T15:07:10Z,43,63,84,0,114 +2017-09-12T15:07:11Z,54,11,180,1,189 +2017-09-12T15:07:12Z,49,95,211,1,237 +2017-09-12T15:07:13Z,87,214,71,1,242 +2017-09-12T15:07:14Z,80,177,36,0,198 +2017-09-12T15:07:15Z,113,50,225,0,257 +2017-09-12T15:07:16Z,42,12,51,1,68 +2017-09-12T15:07:17Z,6,14,102,0,104 +2017-09-12T15:07:18Z,46,119,67,1,145 +2017-09-12T15:07:19Z,37,62,53,1,90 +2017-09-12T15:07:20Z,14,76,78,1,110 +2017-09-12T15:07:21Z,26,27,66,1,76 +2017-09-12T15:07:22Z,11,2,43,0,45 +2017-09-12T15:07:23Z,68,83,67,0,127 +2017-09-12T15:07:24Z,40,56,70,1,99 +2017-09-12T15:07:25Z,123,131,274,1,328 +2017-09-12T15:07:26Z,83,24,117,0,146 +2017-09-12T15:07:27Z,67,77,90,1,137 +2017-09-12T15:07:28Z,58,48,60,1,97 +2017-09-12T15:07:29Z,30,48,25,0,62 +2017-09-12T15:07:30Z,28,83,51,2,102 +2017-09-12T15:07:31Z,30,58,70,1,96 +2017-09-12T15:07:32Z,5,22,90,0,93 +2017-09-12T15:07:33Z,17,26,98,0,103 +2017-09-12T15:07:34Z,66,34,30,2,81 +2017-09-12T15:07:35Z,34,44,11,0,57 +2017-09-12T15:07:36Z,47,53,21,0,74 +2017-09-12T15:07:37Z,28,52,36,0,70 +2017-09-12T15:07:38Z,8,37,48,0,62 +2017-09-12T15:07:39Z,2,41,44,1,61 +2017-09-12T15:07:40Z,25,68,130,0,149 +2017-09-12T15:07:41Z,3,3,12,0,13 +2017-09-12T15:07:42Z,6,1,0,1,7 +2017-09-12T15:07:43Z,30,10,51,0,61 +2017-09-12T15:07:44Z,20,13,54,0,60 +2017-09-12T15:07:45Z,16,22,55,1,62 +2017-09-12T15:07:46Z,5,51,106,0,118 +2017-09-12T15:07:47Z,38,110,165,1,202 +2017-09-12T15:07:48Z,131,156,74,2,217 +2017-09-12T15:07:49Z,85,298,242,0,394 +2017-09-12T15:07:50Z,0,99,67,0,120 +2017-09-12T15:07:51Z,42,83,84,1,126 +2017-09-12T15:07:52Z,269,166,236,1,395 +2017-09-12T15:07:53Z,43,44,163,1,175 +2017-09-12T15:07:54Z,110,13,97,1,148 +2017-09-12T15:07:55Z,55,109,39,0,129 +2017-09-12T15:07:56Z,35,76,29,1,89 +2017-09-12T15:07:57Z,76,143,106,1,194 +2017-09-12T15:07:58Z,36,56,64,0,93 +2017-09-12T15:07:59Z,61,112,140,1,190 +2017-09-12T15:08:00Z,23,172,118,0,210 +2017-09-12T15:08:01Z,73,90,136,0,179 +2017-09-12T15:08:02Z,63,118,101,2,168 +2017-09-12T15:08:03Z,24,57,144,0,157 +2017-09-12T15:08:04Z,138,146,316,1,375 +2017-09-12T15:08:05Z,88,25,116,1,148 +2017-09-12T15:08:06Z,78,181,48,0,203 +2017-09-12T15:08:07Z,13,124,57,0,138 +2017-09-12T15:08:08Z,99,91,218,1,257 +2017-09-12T15:08:09Z,90,131,127,1,204 +2017-09-12T15:08:10Z,83,102,81,0,155 +2017-09-12T15:08:11Z,99,29,98,1,143 +2017-09-12T15:08:12Z,98,38,122,2,162 +2017-09-12T15:08:13Z,88,140,320,1,361 +2017-09-12T15:08:14Z,182,47,206,1,279 +2017-09-12T15:08:15Z,76,44,101,1,134 +2017-09-12T15:08:16Z,103,188,166,1,272 +2017-09-12T15:08:17Z,151,206,215,1,334 +2017-09-12T15:08:18Z,93,217,105,1,259 +2017-09-12T15:08:19Z,93,245,127,1,292 +2017-09-12T15:08:20Z,78,24,196,1,213 +2017-09-12T15:08:21Z,81,93,138,0,186 +2017-09-12T15:08:22Z,85,141,124,2,207 +2017-09-12T15:08:23Z,64,175,209,1,281 +2017-09-12T15:08:24Z,10,35,49,1,62 +2017-09-12T15:08:25Z,0,40,10,0,42 +2017-09-12T15:08:26Z,81,155,160,0,238 +2017-09-12T15:08:27Z,94,185,132,1,246 +2017-09-12T15:08:28Z,42,121,86,0,155 +2017-09-12T15:08:29Z,49,51,37,1,80 +2017-09-12T15:08:30Z,123,213,111,1,270 +2017-09-12T15:08:31Z,46,19,81,1,96 +2017-09-12T15:08:32Z,0,1,49,0,50 +2017-09-12T15:08:33Z,88,207,37,0,228 +2017-09-12T15:08:34Z,50,80,106,2,142 +2017-09-12T15:08:35Z,227,85,218,0,327 +2017-09-12T15:08:36Z,85,157,327,0,373 +2017-09-12T15:08:37Z,179,93,152,0,253 +2017-09-12T15:08:38Z,277,345,306,2,538 +2017-09-12T15:08:39Z,72,38,76,0,112 +2017-09-12T15:08:40Z,191,296,212,1,412 +2017-09-12T15:08:41Z,124,89,98,1,182 +2017-09-12T15:08:42Z,91,76,131,0,177 +2017-09-12T15:08:43Z,29,60,119,1,137 +2017-09-12T15:08:44Z,37,90,75,1,123 +2017-09-12T15:08:45Z,34,52,87,2,107 +2017-09-12T15:08:46Z,104,43,61,0,129 +2017-09-12T15:08:47Z,219,82,141,0,274 +2017-09-12T15:08:48Z,427,231,148,1,508 +2017-09-12T15:08:49Z,89,85,40,0,130 +2017-09-12T15:08:50Z,84,16,9,0,86 +2017-09-12T15:08:51Z,32,0,0,0,32 +2017-09-12T15:08:52Z,8,1,9,0,13 +2017-09-12T15:08:53Z,113,72,127,0,185 +2017-09-12T15:08:54Z,139,126,98,1,212 +2017-09-12T15:08:55Z,130,8,9,0,131 +2017-09-12T15:08:56Z,51,84,119,0,155 +2017-09-12T15:08:57Z,42,61,12,0,76 +2017-09-12T15:08:58Z,12,21,96,1,99 +2017-09-12T15:08:59Z,52,49,121,1,141 +2017-09-12T15:09:00Z,0,13,68,0,70 +2017-09-12T15:09:01Z,0,23,24,0,34 +2017-09-12T15:09:02Z,3,70,6,0,71 +2017-09-12T15:09:03Z,88,158,50,1,188 +2017-09-12T15:09:04Z,86,156,104,1,207 +2017-09-12T15:09:05Z,53,85,43,2,110 +2017-09-12T15:09:06Z,20,86,64,0,110 +2017-09-12T15:09:07Z,59,40,70,0,100 +2017-09-12T15:09:08Z,38,13,37,1,55 +2017-09-12T15:09:09Z,34,8,43,0,56 +2017-09-12T15:09:10Z,74,41,93,3,126 +2017-09-12T15:09:11Z,41,86,87,0,130 +2017-09-12T15:09:12Z,39,54,33,1,75 +2017-09-12T15:09:13Z,39,75,20,0,87 +2017-09-12T15:09:14Z,47,38,34,0,70 +2017-09-12T15:09:15Z,17,32,11,1,38 +2017-09-12T15:09:16Z,1,0,2,0,3 +2017-09-12T15:09:17Z,0,4,0,0,4 +2017-09-12T15:09:18Z,15,24,19,1,35 +2017-09-12T15:09:19Z,83,48,133,1,164 +2017-09-12T15:09:20Z,99,148,128,1,220 +2017-09-12T15:09:21Z,76,112,9,0,136 +2017-09-12T15:09:22Z,2,0,0,0,2 +2017-09-12T15:09:23Z,0,0,0,0,0 +2017-09-12T15:09:24Z,0,0,0,0,0 +2017-09-12T15:09:25Z,0,1,1,0,2 +2017-09-12T15:09:26Z,31,18,3,1,36 +2017-09-12T15:09:27Z,77,6,0,0,78 +2017-09-12T15:09:28Z,86,10,0,0,87 +2017-09-12T15:09:29Z,85,0,26,0,89 +2017-09-12T15:09:30Z,137,56,47,1,156 +2017-09-12T15:09:31Z,42,29,48,1,71 +2017-09-12T15:09:32Z,24,0,1,0,25 +2017-09-12T15:09:33Z,7,0,0,0,7 +2017-09-12T15:09:34Z,154,31,75,0,175 +2017-09-12T15:09:35Z,84,65,90,1,140 +2017-09-12T15:09:36Z,87,3,118,0,147 +2017-09-12T15:09:37Z,46,62,27,1,82 +2017-09-12T15:09:38Z,38,33,31,0,60 +2017-09-12T15:09:39Z,16,59,26,1,67 +2017-09-12T15:09:40Z,59,13,56,0,83 +2017-09-12T15:09:41Z,65,29,60,1,94 +2017-09-12T15:09:42Z,46,20,59,1,78 +2017-09-12T15:09:43Z,103,46,134,1,176 +2017-09-12T15:09:44Z,40,76,95,1,129 +2017-09-12T15:09:45Z,46,52,48,0,85 +2017-09-12T15:09:46Z,49,88,160,0,190 +2017-09-12T15:09:47Z,45,35,137,1,149 +2017-09-12T15:09:48Z,34,82,178,0,199 +2017-09-12T15:09:49Z,117,79,194,2,240 +2017-09-12T15:09:50Z,163,88,181,0,259 +2017-09-12T15:09:51Z,131,118,256,1,311 +2017-09-12T15:09:52Z,7,58,190,1,199 +2017-09-12T15:09:53Z,89,158,104,0,210 +2017-09-12T15:09:54Z,192,227,183,1,350 +2017-09-12T15:09:55Z,212,95,168,1,287 +2017-09-12T15:09:56Z,160,344,111,1,396 +2017-09-12T15:09:57Z,316,258,91,0,418 +2017-09-12T15:09:58Z,243,274,248,1,443 +2017-09-12T15:09:59Z,174,105,80,0,219 +2017-09-12T15:10:00Z,138,47,180,1,232 +2017-09-12T15:10:01Z,128,128,114,0,214 +2017-09-12T15:10:02Z,62,75,155,0,184 +2017-09-12T15:10:03Z,169,330,89,1,382 +2017-09-12T15:10:04Z,146,151,57,1,218 +2017-09-12T15:10:05Z,47,101,52,1,123 +2017-09-12T15:10:06Z,162,198,210,1,331 +2017-09-12T15:10:07Z,52,41,130,1,146 +2017-09-12T15:10:08Z,105,59,157,0,198 +2017-09-12T15:10:09Z,257,130,353,1,456 +2017-09-12T15:10:10Z,134,143,193,0,276 +2017-09-12T15:10:11Z,106,67,104,1,163 +2017-09-12T15:10:12Z,246,286,148,1,406 +2017-09-12T15:10:13Z,285,218,144,0,387 +2017-09-12T15:10:14Z,182,248,120,1,331 +2017-09-12T15:10:15Z,134,225,61,0,269 +2017-09-12T15:10:16Z,284,303,227,1,474 +2017-09-12T15:10:17Z,171,201,176,1,318 +2017-09-12T15:10:18Z,129,73,48,1,156 +2017-09-12T15:10:19Z,112,81,124,1,186 +2017-09-12T15:10:20Z,60,71,33,0,99 +2017-09-12T15:10:21Z,56,70,28,0,94 +2017-09-12T15:10:22Z,130,99,89,1,187 +2017-09-12T15:10:23Z,210,310,152,1,405 +2017-09-12T15:10:24Z,175,226,103,0,304 +2017-09-12T15:10:25Z,51,33,52,1,80 +2017-09-12T15:10:26Z,26,0,0,0,26 +2017-09-12T15:10:27Z,47,15,44,1,67 +2017-09-12T15:10:28Z,128,209,83,1,259 +2017-09-12T15:10:29Z,26,85,65,0,111 +2017-09-12T15:10:30Z,22,249,214,1,330 +2017-09-12T15:10:31Z,124,144,69,1,203 +2017-09-12T15:10:32Z,51,67,218,0,234 +2017-09-12T15:10:33Z,63,30,70,0,99 +2017-09-12T15:10:34Z,18,14,60,1,65 +2017-09-12T15:10:35Z,0,0,0,0,0 +2017-09-12T15:10:36Z,13,76,60,0,98 +2017-09-12T15:10:37Z,33,78,70,1,110 +2017-09-12T15:10:38Z,46,63,55,0,96 +2017-09-12T15:10:39Z,36,54,20,1,68 +2017-09-12T15:10:40Z,53,47,31,0,78 +2017-09-12T15:10:41Z,77,153,85,1,192 +2017-09-12T15:10:42Z,73,97,85,0,149 +2017-09-12T15:10:43Z,57,75,44,1,104 +2017-09-12T15:10:44Z,25,64,83,0,108 +2017-09-12T15:10:45Z,0,24,31,0,40 +2017-09-12T15:10:46Z,13,20,23,1,34 +2017-09-12T15:10:47Z,20,9,4,0,23 +2017-09-12T15:10:48Z,54,39,46,0,81 +2017-09-12T15:10:49Z,11,0,20,1,23 +2017-09-12T15:10:50Z,25,0,13,1,29 +2017-09-12T15:10:51Z,2,23,37,0,44 +2017-09-12T15:10:52Z,101,48,31,1,117 +2017-09-12T15:10:53Z,84,121,79,1,168 +2017-09-12T15:10:54Z,73,176,180,1,263 +2017-09-12T15:10:55Z,135,74,299,1,337 +2017-09-12T15:10:56Z,171,246,208,1,365 +2017-09-12T15:10:57Z,67,46,182,1,200 +2017-09-12T15:10:58Z,116,51,202,1,239 +2017-09-12T15:10:59Z,20,0,54,0,58 +2017-09-12T15:11:00Z,5,0,34,0,35 +2017-09-12T15:11:01Z,0,4,0,0,4 +2017-09-12T15:11:02Z,43,61,69,1,102 +2017-09-12T15:11:03Z,35,46,41,1,71 +2017-09-12T15:11:04Z,23,66,61,0,93 +2017-09-12T15:11:05Z,80,131,110,1,189 +2017-09-12T15:11:06Z,77,104,100,1,164 +2017-09-12T15:11:07Z,96,107,162,1,217 +2017-09-12T15:11:08Z,153,65,184,1,248 +2017-09-12T15:11:09Z,139,65,184,0,240 +2017-09-12T15:11:10Z,247,246,174,1,390 +2017-09-12T15:11:11Z,158,126,210,1,292 +2017-09-12T15:11:12Z,122,128,125,0,217 +2017-09-12T15:11:13Z,61,69,246,1,263 +2017-09-12T15:11:14Z,73,223,150,2,279 +2017-09-12T15:11:15Z,47,36,222,1,230 +2017-09-12T15:11:16Z,34,47,164,1,174 +2017-09-12T15:11:17Z,110,367,205,0,435 +2017-09-12T15:11:18Z,173,126,137,0,255 +2017-09-12T15:11:19Z,370,269,265,2,529 +2017-09-12T15:11:20Z,394,307,282,0,574 +2017-09-12T15:11:21Z,85,234,122,1,278 +2017-09-12T15:11:22Z,195,267,245,1,412 +2017-09-12T15:11:23Z,34,158,171,1,236 +2017-09-12T15:11:24Z,53,128,239,1,277 +2017-09-12T15:11:25Z,156,60,127,0,210 +2017-09-12T15:11:26Z,100,39,115,1,158 +2017-09-12T15:11:27Z,73,13,41,1,85 +2017-09-12T15:11:28Z,46,40,47,0,77 +2017-09-12T15:11:29Z,88,1,37,1,96 +2017-09-12T15:11:30Z,8,36,0,0,37 +2017-09-12T15:11:31Z,0,10,0,0,10 +2017-09-12T15:11:32Z,45,4,3,1,46 +2017-09-12T15:11:33Z,40,14,26,0,50 +2017-09-12T15:11:34Z,92,50,22,0,107 +2017-09-12T15:11:35Z,125,72,142,1,203 +2017-09-12T15:11:36Z,131,25,42,0,140 +2017-09-12T15:11:37Z,186,116,111,1,246 +2017-09-12T15:11:38Z,180,33,48,0,190 +2017-09-12T15:11:39Z,233,75,29,0,247 +2017-09-12T15:11:40Z,91,2,160,1,185 +2017-09-12T15:11:41Z,74,0,49,0,89 +2017-09-12T15:11:42Z,47,0,58,0,75 +2017-09-12T15:11:43Z,0,0,0,0,0 +2017-09-12T15:11:44Z,0,0,0,0,0 +2017-09-12T15:11:45Z,0,0,0,0,0 +2017-09-12T15:11:46Z,92,20,102,0,139 +2017-09-12T15:11:47Z,41,0,43,0,60 +2017-09-12T15:11:48Z,49,0,47,0,68 +2017-09-12T15:11:49Z,11,6,2,1,13 +2017-09-12T15:11:50Z,52,22,26,0,63 +2017-09-12T15:11:51Z,49,6,25,1,56 +2017-09-12T15:11:52Z,16,0,0,0,16 +2017-09-12T15:11:53Z,0,53,0,0,53 +2017-09-12T15:11:54Z,0,19,0,0,19 +2017-09-12T15:11:55Z,50,34,89,0,108 +2017-09-12T15:11:56Z,81,51,102,1,140 +2017-09-12T15:11:57Z,56,14,50,0,77 +2017-09-12T15:11:58Z,43,26,47,1,69 +2017-09-12T15:11:59Z,35,28,41,0,61 +2017-09-12T15:12:00Z,64,14,64,1,92 +2017-09-12T15:12:01Z,122,22,75,0,145 +2017-09-12T15:12:02Z,74,31,39,1,90 +2017-09-12T15:12:03Z,0,0,0,0,0 +2017-09-12T15:12:04Z,66,44,30,1,85 +2017-09-12T15:12:05Z,25,4,2,1,26 +2017-09-12T15:12:06Z,22,10,10,0,27 +2017-09-12T15:12:07Z,69,68,106,1,144 +2017-09-12T15:12:08Z,60,42,54,0,91 +2017-09-12T15:12:09Z,155,50,103,1,193 +2017-09-12T15:12:10Z,217,41,63,0,230 +2017-09-12T15:12:11Z,93,0,38,1,101 +2017-09-12T15:12:12Z,65,16,29,0,73 +2017-09-12T15:12:13Z,14,21,0,0,26 +2017-09-12T15:12:14Z,0,0,0,0,0 +2017-09-12T15:12:15Z,0,0,0,0,0 +2017-09-12T15:12:16Z,0,0,0,0,0 +2017-09-12T15:12:17Z,0,0,0,0,0 +2017-09-12T15:12:18Z,0,0,0,0,0 +2017-09-12T15:12:19Z,8,3,0,0,9 +2017-09-12T15:12:20Z,0,0,0,0,0 +2017-09-12T15:12:21Z,0,0,0,0,0 +2017-09-12T15:12:22Z,0,0,0,0,0 +2017-09-12T15:12:23Z,0,0,0,0,0 +2017-09-12T15:12:24Z,5,0,0,0,5 +2017-09-12T15:12:25Z,5,1,12,0,14 +2017-09-12T15:12:26Z,0,0,0,0,0 +2017-09-12T15:12:27Z,0,0,0,0,0 +2017-09-12T15:12:28Z,0,0,0,0,0 +2017-09-12T15:12:29Z,11,1,30,0,32 +2017-09-12T15:12:30Z,0,7,0,0,7 +2017-09-12T15:12:31Z,10,27,30,0,42 +2017-09-12T15:12:32Z,70,59,69,1,115 +2017-09-12T15:12:33Z,33,21,34,0,52 +2017-09-12T15:12:34Z,34,14,4,1,37 +2017-09-12T15:12:35Z,2,0,0,0,2 +2017-09-12T15:12:36Z,13,0,0,0,13 +2017-09-12T15:12:37Z,153,78,109,1,204 +2017-09-12T15:12:38Z,117,26,64,0,136 +2017-09-12T15:12:39Z,85,40,98,0,136 +2017-09-12T15:12:40Z,117,59,130,1,185 +2017-09-12T15:12:41Z,126,26,51,0,139 +2017-09-12T15:12:42Z,171,86,55,1,200 +2017-09-12T15:12:43Z,161,91,65,1,197 +2017-09-12T15:12:44Z,54,2,51,0,75 +2017-09-12T15:12:45Z,75,30,40,0,91 +2017-09-12T15:12:46Z,120,365,49,1,388 +2017-09-12T15:12:47Z,4,149,42,0,155 +2017-09-12T15:12:48Z,0,61,0,0,61 +2017-09-12T15:12:49Z,0,0,0,0,0 +2017-09-12T15:12:50Z,0,13,64,0,66 +2017-09-12T15:12:51Z,13,0,26,0,30 +2017-09-12T15:12:52Z,48,0,27,1,56 +2017-09-12T15:12:53Z,28,0,5,0,29 +2017-09-12T15:12:54Z,0,0,10,0,10 +2017-09-12T15:12:55Z,0,0,0,0,0 +2017-09-12T15:12:56Z,0,0,0,0,0 +2017-09-12T15:12:57Z,6,33,33,0,48 +2017-09-12T15:12:58Z,50,30,17,0,61 +2017-09-12T15:12:59Z,19,0,7,1,21 +2017-09-12T15:13:00Z,4,14,3,0,15 +2017-09-12T15:13:01Z,164,230,147,1,319 +2017-09-12T15:13:02Z,98,57,35,0,119 +2017-09-12T15:13:03Z,67,4,92,1,114 +2017-09-12T15:13:04Z,177,63,240,1,305 +2017-09-12T15:13:05Z,75,9,79,0,110 +2017-09-12T15:13:06Z,22,0,52,0,57 +2017-09-12T15:13:07Z,0,22,9,0,24 +2017-09-12T15:13:08Z,4,10,45,0,47 +2017-09-12T15:13:09Z,195,108,85,1,239 +2017-09-12T15:13:10Z,257,192,139,0,350 +2017-09-12T15:13:11Z,173,41,59,0,188 +2017-09-12T15:13:12Z,228,126,61,1,268 +2017-09-12T15:13:13Z,100,146,38,0,181 +2017-09-12T15:13:14Z,59,82,62,2,119 +2017-09-12T15:13:15Z,55,55,83,1,114 +2017-09-12T15:13:16Z,121,42,123,1,178 +2017-09-12T15:13:17Z,95,44,100,0,145 +2017-09-12T15:13:18Z,33,21,20,0,44 +2017-09-12T15:13:19Z,34,16,19,1,43 +2017-09-12T15:13:20Z,107,72,25,0,132 +2017-09-12T15:13:21Z,12,45,35,1,59 +2017-09-12T15:13:22Z,34,13,25,0,45 +2017-09-12T15:13:23Z,31,2,16,1,35 +2017-09-12T15:13:24Z,39,54,70,2,97 +2017-09-12T15:13:25Z,42,10,81,1,92 +2017-09-12T15:13:26Z,74,1,114,2,136 +2017-09-12T15:13:27Z,46,39,50,2,79 +2017-09-12T15:13:28Z,61,22,108,2,126 +2017-09-12T15:13:29Z,46,43,61,0,88 +2017-09-12T15:13:30Z,40,95,83,1,133 +2017-09-12T15:13:31Z,290,226,143,1,395 +2017-09-12T15:13:32Z,214,279,63,1,358 +2017-09-12T15:13:33Z,59,82,78,0,128 +2017-09-12T15:13:34Z,9,74,43,0,87 +2017-09-12T15:13:35Z,23,39,96,0,107 +2017-09-12T15:13:36Z,69,160,114,1,209 +2017-09-12T15:13:37Z,37,90,23,1,100 +2017-09-12T15:13:38Z,52,180,79,1,204 +2017-09-12T15:13:39Z,55,52,112,0,136 +2017-09-12T15:13:40Z,95,153,97,1,205 +2017-09-12T15:13:41Z,59,151,162,2,230 +2017-09-12T15:13:42Z,64,134,128,0,197 +2017-09-12T15:13:43Z,0,27,13,0,30 +2017-09-12T15:13:44Z,2,11,0,1,12 +2017-09-12T15:13:45Z,15,5,20,1,26 +2017-09-12T15:13:46Z,37,78,49,2,100 +2017-09-12T15:13:47Z,84,94,159,2,203 +2017-09-12T15:13:48Z,113,158,117,0,227 +2017-09-12T15:13:49Z,45,128,117,0,180 +2017-09-12T15:13:50Z,152,171,126,1,262 +2017-09-12T15:13:51Z,116,102,61,2,167 +2017-09-12T15:13:52Z,128,152,228,2,303 +2017-09-12T15:13:53Z,242,252,103,1,365 +2017-09-12T15:13:54Z,388,563,621,2,924 +2017-09-12T15:13:55Z,357,436,280,0,630 +2017-09-12T15:13:56Z,188,161,186,2,310 +2017-09-12T15:13:57Z,239,161,74,0,298 +2017-09-12T15:13:58Z,278,136,78,1,320 +2017-09-12T15:13:59Z,296,130,117,1,344 +2017-09-12T15:14:00Z,25,236,121,0,267 +2017-09-12T15:14:01Z,38,51,65,0,91 +2017-09-12T15:14:02Z,1,43,50,1,66 +2017-09-12T15:14:03Z,0,1,2,0,3 +2017-09-12T15:14:04Z,128,161,110,0,234 +2017-09-12T15:14:05Z,353,106,173,0,408 +2017-09-12T15:14:06Z,362,75,173,1,409 +2017-09-12T15:14:07Z,36,18,24,0,47 +2017-09-12T15:14:08Z,38,0,18,0,43 +2017-09-12T15:14:09Z,36,2,3,0,37 +2017-09-12T15:14:10Z,193,190,191,0,332 +2017-09-12T15:14:11Z,108,136,182,1,252 +2017-09-12T15:14:12Z,93,99,96,0,167 +2017-09-12T15:14:13Z,53,17,99,1,114 +2017-09-12T15:14:14Z,105,12,161,0,193 +2017-09-12T15:14:15Z,80,27,121,0,148 +2017-09-12T15:14:16Z,46,3,114,1,123 +2017-09-12T15:14:17Z,11,21,89,0,93 +2017-09-12T15:14:18Z,0,12,65,0,67 +2017-09-12T15:14:19Z,4,5,78,1,79 +2017-09-12T15:14:20Z,17,24,184,0,187 +2017-09-12T15:14:21Z,17,49,22,1,57 +2017-09-12T15:14:22Z,35,26,93,1,103 +2017-09-12T15:14:23Z,33,10,169,0,173 +2017-09-12T15:14:24Z,15,11,159,1,161 +2017-09-12T15:14:25Z,47,73,71,0,113 +2017-09-12T15:14:26Z,11,70,22,1,75 +2017-09-12T15:14:27Z,19,11,35,0,42 +2017-09-12T15:14:28Z,7,0,15,0,17 +2017-09-12T15:14:29Z,5,7,98,1,99 +2017-09-12T15:14:30Z,0,0,75,0,75 +2017-09-12T15:14:31Z,5,15,15,0,22 +2017-09-12T15:14:32Z,0,4,78,0,79 +2017-09-12T15:14:33Z,0,0,37,0,37 +2017-09-12T15:14:34Z,0,3,62,0,63 +2017-09-12T15:14:35Z,38,8,66,1,77 +2017-09-12T15:14:36Z,47,28,131,0,142 +2017-09-12T15:14:37Z,45,140,49,1,156 +2017-09-12T15:14:38Z,102,89,26,0,138 +2017-09-12T15:14:39Z,88,133,34,0,164 +2017-09-12T15:14:40Z,54,0,0,1,54 +2017-09-12T15:14:41Z,44,0,30,0,54 +2017-09-12T15:14:42Z,0,0,0,0,0 +2017-09-12T15:14:43Z,0,0,0,0,0 +2017-09-12T15:14:44Z,50,0,7,0,51 +2017-09-12T15:14:45Z,167,170,232,1,333 +2017-09-12T15:14:46Z,134,177,278,1,356 +2017-09-12T15:14:47Z,66,112,157,1,204 +2017-09-12T15:14:48Z,20,24,18,0,37 +2017-09-12T15:14:49Z,29,52,78,1,99 +2017-09-12T15:14:50Z,276,100,176,1,343 +2017-09-12T15:14:51Z,148,82,66,0,182 +2017-09-12T15:14:52Z,220,74,87,1,248 +2017-09-12T15:14:53Z,81,0,19,1,84 +2017-09-12T15:14:54Z,39,12,26,1,49 +2017-09-12T15:14:55Z,150,47,23,0,159 +2017-09-12T15:14:56Z,125,20,0,1,127 +2017-09-12T15:14:57Z,57,0,0,1,57 +2017-09-12T15:14:58Z,101,0,0,0,101 +2017-09-12T15:14:59Z,115,5,5,1,116 +2017-09-12T15:15:00Z,171,34,20,0,176 +2017-09-12T15:15:01Z,178,98,98,0,226 +2017-09-12T15:15:02Z,73,52,29,1,95 +2017-09-12T15:15:03Z,58,20,4,0,62 +2017-09-12T15:15:04Z,120,78,64,0,157 +2017-09-12T15:15:05Z,97,49,65,1,127 +2017-09-12T15:15:06Z,79,70,77,2,131 +2017-09-12T15:15:07Z,88,11,28,1,93 +2017-09-12T15:15:08Z,136,47,77,1,164 +2017-09-12T15:15:09Z,194,121,101,1,250 +2017-09-12T15:15:10Z,141,113,188,1,261 +2017-09-12T15:15:11Z,312,359,124,1,492 +2017-09-12T15:15:12Z,123,229,89,0,275 +2017-09-12T15:15:13Z,254,145,150,1,329 +2017-09-12T15:15:14Z,147,162,134,1,257 +2017-09-12T15:15:15Z,65,76,77,1,127 +2017-09-12T15:15:16Z,77,61,126,2,160 +2017-09-12T15:15:17Z,48,17,70,1,87 +2017-09-12T15:15:18Z,43,50,54,0,86 +2017-09-12T15:15:19Z,59,45,45,1,87 +2017-09-12T15:15:20Z,147,133,203,1,284 +2017-09-12T15:15:21Z,130,183,123,1,256 +2017-09-12T15:15:22Z,294,484,274,1,630 +2017-09-12T15:15:23Z,127,147,266,0,330 +2017-09-12T15:15:24Z,36,61,160,1,175 +2017-09-12T15:15:25Z,46,35,75,1,95 +2017-09-12T15:15:26Z,22,29,22,2,43 +2017-09-12T15:15:27Z,20,26,2,1,33 +2017-09-12T15:15:28Z,38,15,56,1,70 +2017-09-12T15:15:29Z,21,33,1,0,40 +2017-09-12T15:15:30Z,0,0,0,0,0 +2017-09-12T15:15:31Z,0,0,0,0,0 +2017-09-12T15:15:32Z,0,0,0,0,0 +2017-09-12T15:15:33Z,0,0,0,0,0 +2017-09-12T15:15:34Z,0,0,0,0,0 +2017-09-12T15:15:35Z,0,0,3,0,3 +2017-09-12T15:15:36Z,37,60,64,1,96 +2017-09-12T15:15:37Z,176,112,33,1,212 +2017-09-12T15:15:38Z,218,265,101,2,358 +2017-09-12T15:15:39Z,379,173,339,2,538 +2017-09-12T15:15:40Z,308,151,385,2,516 +2017-09-12T15:15:41Z,77,120,119,2,186 +2017-09-12T15:15:42Z,93,52,40,2,114 +2017-09-12T15:15:43Z,65,68,22,2,97 +2017-09-12T15:15:44Z,93,76,101,2,157 +2017-09-12T15:15:45Z,96,97,69,0,153 +2017-09-12T15:15:46Z,73,126,194,0,243 +2017-09-12T15:15:47Z,172,119,327,2,389 +2017-09-12T15:15:48Z,45,63,38,0,87 +2017-09-12T15:15:49Z,69,0,99,0,121 +2017-09-12T15:15:50Z,28,8,114,1,118 +2017-09-12T15:15:51Z,22,42,197,0,203 +2017-09-12T15:15:52Z,25,32,69,0,81 +2017-09-12T15:15:53Z,0,16,36,0,40 +2017-09-12T15:15:54Z,33,83,128,0,157 +2017-09-12T15:15:55Z,35,94,55,1,115 +2017-09-12T15:15:56Z,72,55,83,0,123 +2017-09-12T15:15:57Z,33,55,89,1,110 +2017-09-12T15:15:58Z,82,49,58,2,112 +2017-09-12T15:15:59Z,60,71,66,2,115 +2017-09-12T15:16:00Z,70,50,51,2,101 +2017-09-12T15:16:01Z,43,38,56,2,81 +2017-09-12T15:16:02Z,84,54,83,2,130 +2017-09-12T15:16:03Z,59,53,64,2,102 +2017-09-12T15:16:04Z,33,33,59,2,76 +2017-09-12T15:16:05Z,49,40,33,1,72 +2017-09-12T15:16:06Z,35,88,38,1,103 +2017-09-12T15:16:07Z,49,38,29,2,69 +2017-09-12T15:16:08Z,39,56,30,1,75 +2017-09-12T15:16:09Z,36,55,15,1,68 +2017-09-12T15:16:10Z,57,84,28,1,106 +2017-09-12T15:16:11Z,44,58,38,2,83 +2017-09-12T15:16:12Z,107,69,77,2,149 +2017-09-12T15:16:13Z,28,66,62,2,95 +2017-09-12T15:16:14Z,68,45,19,2,84 +2017-09-12T15:16:15Z,82,64,73,2,128 +2017-09-12T15:16:16Z,43,77,50,1,102 +2017-09-12T15:16:17Z,38,36,43,1,68 +2017-09-12T15:16:18Z,86,78,33,1,121 +2017-09-12T15:16:19Z,58,48,52,1,92 +2017-09-12T15:16:20Z,93,41,33,2,107 +2017-09-12T15:16:21Z,73,88,39,1,121 +2017-09-12T15:16:22Z,20,30,64,0,74 +2017-09-12T15:16:23Z,17,7,15,1,24 +2017-09-12T15:16:24Z,23,15,44,1,52 +2017-09-12T15:16:25Z,52,23,73,1,93 +2017-09-12T15:16:26Z,151,129,25,1,201 +2017-09-12T15:16:27Z,37,69,50,0,93 +2017-09-12T15:16:28Z,195,135,198,2,309 +2017-09-12T15:16:29Z,88,117,48,1,155 +2017-09-12T15:16:30Z,92,116,55,1,158 +2017-09-12T15:16:31Z,136,88,81,2,182 +2017-09-12T15:16:32Z,179,106,123,1,242 +2017-09-12T15:16:33Z,136,81,165,1,229 +2017-09-12T15:16:34Z,123,95,101,1,186 +2017-09-12T15:16:35Z,87,85,70,1,141 +2017-09-12T15:16:36Z,72,94,61,2,134 +2017-09-12T15:16:37Z,48,75,51,2,103 +2017-09-12T15:16:38Z,81,76,19,2,113 +2017-09-12T15:16:39Z,56,53,33,2,84 diff --git a/inst/testfiles/ActiGraph61.csv b/inst/testfiles/ActiGraph61.csv new file mode 100644 index 0000000..a598218 --- /dev/null +++ b/inst/testfiles/ActiGraph61.csv @@ -0,0 +1,1000 @@ +------------ Data File Created By ActiGraph wGT3XBT ActiLife v6.13.3 Firmware v1.8.0 date format M/d/yyyy Filter Normal Multiple Incline Limb: Waist -----------,,,,,,,, +Serial Number: MOS2D16160581,,,,,,,, +Start Time 21:35:00,,,,,,,, +Start Date 8/15/2016,,,,,,,, +Epoch Period (hh:mm:ss) 00:00:05,,,,,,,, +Download Time 18:59:15,,,,,,,, +Download Date 8/24/2016,,,,,,,, +Current Memory Address: 0,,,,,,,, +Current Battery Voltage: 4.03 Mode = 61,,,,,,,, +--------------------------------------------------,,,,,,,, +325,85,176,2,0,0,5,0,0 +181,116,91,1,0,0,5,0,0 +4,47,153,0,0,0,0,0,5 +246,258,306,2,0,0,5,0,0 +131,81,31,1,0,0,5,0,0 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,0,0,0,5 +213,240,255,1,0,0,5,0,0 +25,21,96,0,0,0,0,0,5 +53,237,115,1,0,0,5,0,0 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +7,178,106,0,0,0,0,0,5 +41,187,96,1,0,0,5,0,0 +7,151,66,1,0,0,0,0,5 +0,13,0,0,0,0,0,0,5 +84,235,172,2,0,0,5,0,0 +50,375,87,1,0,0,5,0,0 +2,359,91,0,0,0,0,0,5 +19,240,82,1,0,0,0,0,5 +0,75,72,0,0,0,0,0,5 +34,372,5,2,0,0,0,0,5 +27,324,2,4,0,0,0,0,5 +3,141,0,1,0,0,0,0,5 +5,251,0,1,0,0,0,0,5 +5,237,0,0,0,0,0,0,5 +13,224,0,1,0,0,0,0,5 +6,223,0,1,0,0,0,0,5 +10,237,0,0,0,0,0,0,5 +12,220,0,2,0,0,0,0,5 +37,190,28,1,0,0,5,0,0 +46,206,12,2,0,0,5,0,0 +5,392,0,0,0,0,0,0,5 +0,332,0,0,0,0,0,0,5 +7,190,92,1,0,0,0,0,5 +38,199,81,1,0,0,5,0,0 +72,276,8,5,0,0,5,0,0 +87,285,4,5,0,0,5,0,0 +71,300,0,4,0,0,5,0,0 +21,112,27,2,0,0,0,0,5 +115,365,13,1,0,0,5,0,0 +51,350,5,4,0,0,5,0,0 +61,398,6,4,0,0,5,0,0 +59,359,0,5,0,0,5,0,0 +22,312,0,3,0,0,0,0,5 +45,335,0,5,0,0,5,0,0 +20,351,0,0,0,0,0,0,5 +18,394,0,0,0,0,0,0,5 +26,413,0,1,0,0,0,0,5 +16,404,0,1,0,0,0,0,5 +14,368,0,1,0,0,0,0,5 +20,395,0,0,0,0,0,0,5 +15,397,0,0,0,0,0,0,5 +5,406,0,0,0,0,0,0,5 +9,392,0,0,0,0,0,0,5 +7,365,15,0,0,0,0,0,5 +52,384,51,1,0,0,5,0,0 +45,441,0,5,0,0,5,0,0 +60,374,0,5,0,0,5,0,0 +47,396,0,4,0,0,5,0,0 +34,402,0,2,0,0,0,0,5 +38,392,0,3,0,0,5,0,0 +32,390,0,3,0,0,0,0,5 +39,419,0,3,0,0,5,0,0 +30,307,0,3,0,0,0,0,5 +39,211,0,2,0,0,5,0,0 +9,200,0,0,0,0,0,0,5 +38,211,0,2,0,0,5,0,0 +73,346,3,1,0,0,5,0,0 +157,412,34,8,0,0,5,0,0 +127,356,0,7,0,0,5,0,0 +117,391,0,6,0,0,5,0,0 +129,397,0,9,0,0,5,0,0 +116,387,0,9,0,0,5,0,0 +114,384,0,8,0,0,5,0,0 +94,339,0,7,0,0,5,0,0 +94,348,0,7,0,0,5,0,0 +85,356,0,7,0,0,5,0,0 +101,368,0,9,0,0,5,0,0 +107,383,0,7,0,0,5,0,0 +91,187,1,4,0,0,5,0,0 +112,248,4,3,0,0,5,0,0 +69,191,0,4,0,0,5,0,0 +111,270,179,2,0,0,5,0,0 +90,364,42,7,0,0,5,0,0 +123,268,17,8,0,0,5,0,0 +121,108,115,3,0,0,5,0,0 +77,49,77,2,0,0,5,0,0 +56,37,101,1,0,0,5,0,0 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +47,0,0,2,0,0,5,0,0 +30,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +6,62,12,1,0,0,0,0,5 +72,92,34,2,0,0,5,0,0 +0,5,0,0,0,0,0,0,5 +90,90,29,2,0,0,5,0,0 +1,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +33,0,0,1,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +69,31,33,1,0,0,5,0,0 +0,0,20,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +14,0,0,0,0,0,0,0,5 +16,0,0,0,0,0,0,0,5 +17,11,2,1,0,0,0,5,0 +0,1,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,3,0,0,0,0,0,0,5 +0,5,10,0,0,0,0,0,5 +0,15,19,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,6,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,3,0,0,0,0,0,5 +10,54,10,0,0,0,0,0,5 +0,5,0,0,0,0,0,2,3 +0,2,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +2,33,0,0,0,0,0,0,5 +0,26,0,0,0,0,0,0,5 +0,4,0,0,0,0,0,0,5 +0,11,1,0,0,0,0,0,5 +0,12,0,0,0,0,0,0,5 +0,5,0,0,0,0,0,0,5 +0,5,0,0,0,0,0,0,5 +5,2,0,0,0,0,0,0,5 +0,4,0,0,0,0,0,0,5 +0,2,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,7,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,4,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,7,2,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,2,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +8,0,0,0,0,0,0,0,5 +4,0,0,0,0,0,0,0,5 +26,0,0,0,0,0,0,2,3 +27,0,0,1,0,0,0,2,3 +21,0,0,0,0,0,0,0,5 +0,6,7,0,0,0,0,0,5 +33,7,0,1,0,0,0,0,5 +3,5,0,0,0,0,0,0,5 +2,4,0,0,0,0,0,0,5 +0,16,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,16,0,0,0,0,0,5 +1,1,0,1,0,0,0,0,5 +13,14,7,0,0,0,0,0,5 +0,31,5,0,0,0,0,0,5 +17,47,16,1,0,0,0,0,5 +1,34,17,0,0,0,0,0,5 +5,22,12,1,0,0,0,0,5 +0,19,0,0,0,0,0,0,5 +0,9,0,0,0,0,0,0,5 +0,11,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +3,43,24,0,0,0,0,0,5 +0,4,0,0,0,0,0,0,5 +0,9,0,0,0,0,0,0,5 +0,36,13,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +76,0,11,1,0,0,5,0,0 +23,0,35,1,0,0,0,5,0 +11,7,6,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,2,0,0,0,0,0,0,5 +0,14,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +100,2,0,1,0,0,5,0,0 +8,0,24,1,0,0,0,0,5 +3,23,6,0,0,0,0,0,5 +0,13,2,0,0,0,0,0,5 +34,12,27,1,0,0,0,0,5 +6,0,40,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,6,0,0,0,0,0,0,5 +0,6,0,0,0,0,0,0,5 +0,26,11,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,3,0,0,0,0,0,0,5 +0,21,21,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +20,38,11,1,0,0,0,0,5 +2,4,0,0,0,0,0,0,5 +17,27,13,1,0,0,0,0,5 +87,10,8,1,0,0,5,0,0 +9,0,49,0,0,0,0,4,1 +0,0,0,0,0,0,0,0,5 +7,30,0,1,0,0,0,0,5 +22,2,0,0,0,0,0,0,5 +0,0,4,0,0,0,0,0,5 +9,0,0,0,0,0,0,0,5 +4,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +36,0,0,0,0,0,5,0,0 +0,0,3,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,1,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +6,20,21,1,0,0,0,0,5 +2,14,4,0,0,0,0,0,5 +38,19,107,0,0,0,5,0,0 +0,0,66,0,0,0,0,0,5 +0,3,75,0,0,0,0,0,5 +0,4,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,5,2,0,0,0,0,0,5 +2,13,3,0,0,0,0,0,5 +13,12,15,1,0,0,0,0,5 +4,26,20,0,0,0,0,0,5 +0,2,0,0,0,0,0,0,5 +16,0,0,1,0,0,0,0,5 +0,0,0,0,0,0,0,3,2 +0,0,0,0,0,0,0,2,3 +0,0,6,0,0,0,0,0,5 +0,0,3,0,0,0,0,0,5 +130,22,46,1,0,0,5,0,0 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +6,0,0,1,0,0,0,0,5 +11,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,0,0,0,5 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 +0,0,0,0,0,5,0,0,0 diff --git a/man/readActiGraphCount.Rd b/man/readActiGraphCount.Rd new file mode 100644 index 0000000..0addd30 --- /dev/null +++ b/man/readActiGraphCount.Rd @@ -0,0 +1,37 @@ +\name{readActiGraphCount} +\alias{readActiGraphCount} +\title{ + Read ActiGraph Count data files (csv) +} +\description{ + Reads ActiGraph Count data file. Currently a variety of csv format are facilitated. +} +\usage{ + readActiGraphCount(filename = file, desiredEpochSize = NULL, + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "") +} +\arguments{ + \item{filename}{ + filename (required) + } + \item{desiredEpochSize}{ + Numeric, desired epoch size in seconds. If set aggregate data by summation to + this epochsize. + } + \item{timeformat}{ + Character, timestemp format. + } + \item{tz}{ + Character, timezone name from the timezone database names. + } +} +\value{ + \item{data}{Matrix with one or multiple columns} + \item{epochSize}{epoch size in seconds of data} + \item{startTime}{POSIXlt format timestamp on which recording starts } + \item{deviceSerialNumber}{Device serial number if it could be extracted + from the file header} +} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/tests/testthat/test_readActiGraphCount.R b/tests/testthat/test_readActiGraphCount.R new file mode 100644 index 0000000..22ae117 --- /dev/null +++ b/tests/testthat/test_readActiGraphCount.R @@ -0,0 +1,66 @@ +library(GGIRread) +context("read ActiGraph csv files") +test_that("ActiGraph61 is correctly read", { + file = system.file("testfiles/ActiGraph61.csv", package = "GGIRread") + D = readActiGraphCount(filename = file, desiredEpochSize = 10, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + expect_equal(D$deviceSerialNumber, "MOS2D16160581") + expect_equal(D$epochSize, 10) + expect_equal(format(D$startTime), "2016-08-15 21:35:00") + expect_equal(nrow(D$data), 495) + expect_equal(ncol(D$data), 4) + expect_equal(sum(D$data), 63952.33) + + D = readActiGraphCount(filename = file, desiredEpochSize = 5, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + expect_equal(D$deviceSerialNumber, "MOS2D16160581") + expect_equal(D$epochSize, 5) + expect_equal(format(D$startTime), "2016-08-15 21:35:00") + expect_equal(nrow(D$data), 990) + expect_equal(ncol(D$data), 4) + expect_equal(sum(D$data), 63952.33) +}) + +test_that("ActiGraph31 is correctly read", { + file = system.file("testfiles/ActiGraph13.csv", package = "GGIRread") + D = readActiGraphCount(filename = file, desiredEpochSize = 15, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + expect_equal(D$deviceSerialNumber, "CLE2A2123456") + expect_equal(D$epochSize, 15) + expect_equal(format(D$startTime), "2013-08-26 09:00:00") + expect_equal(nrow(D$data), 990) + expect_equal(ncol(D$data), 4) + expect_equal(sum(D$data), 272870.6, tol = 0.1) + + D = readActiGraphCount(filename = file, desiredEpochSize = 30, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + expect_equal(D$deviceSerialNumber, "CLE2A2123456") + expect_equal(D$epochSize, 30) + expect_equal(format(D$startTime), "2013-08-26 09:00:00") + expect_equal(nrow(D$data), 495) + expect_equal(ncol(D$data), 4) + expect_equal(sum(D$data), 272870.6, tol = 0.1) +}) + +test_that("ActiGraph13_timestamps_headers.csv is correctly read", { + file = system.file("testfiles/ActiGraph13_timestamps_headers.csv", package = "GGIRread") + D = readActiGraphCount(filename = file, desiredEpochSize = 1, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") + expect_equal(D$deviceSerialNumber, "TAS1D48140206") + expect_equal(D$epochSize, 1) + expect_equal(format(D$startTime), "2017-12-09 15:00:00") + expect_equal(nrow(D$data), 1000) + expect_equal(ncol(D$data), 4) + expect_equal(sum(D$data), 256047) + + + D = readActiGraphCount(filename = file, desiredEpochSize = 5, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") + expect_equal(D$deviceSerialNumber, "TAS1D48140206") + expect_equal(D$epochSize, 5) + expect_equal(format(D$startTime), "2017-12-09 15:00:00") + expect_equal(nrow(D$data), 200) + expect_equal(ncol(D$data), 4) + expect_equal(sum(D$data), 256047) + + expect_error(readActiGraphCount(filename = file, + desiredEpochSize = 5, + timeformat = "%m/%d/%Y %H:%M:%S")) + expect_error(readActiGraphCount(filename = file, + desiredEpochSize = 0.5, + timeformat = "%d-%m-%Y %H:%M:%S")) +}) \ No newline at end of file From 5149a61b48cbaa00e645fdf237d8f72a6d2c183a Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Thu, 26 Sep 2024 13:02:24 +0200 Subject: [PATCH 02/25] migrate function for reading Actiwatch to GGIRread and revise implementation for ActiGraph #68 --- NAMESPACE | 2 +- NEWS.md | 3 +- R/readActiGraphCount.R | 21 +- R/readActiwatchCount.R | 129 +++ R/utils_for_countdata.R | 45 + inst/testfiles/Actiwatch.AWD | 336 +++++++ inst/testfiles/Actiwatch.csv | 1010 ++++++++++++++++++++++ man/readActiGraphCount.Rd | 7 +- man/readActiwatchCount.Rd | 42 + tests/testthat/test_readActiGraphCount.R | 15 +- tests/testthat/test_readActiwatchCount.R | 56 ++ 11 files changed, 1646 insertions(+), 20 deletions(-) create mode 100644 R/readActiwatchCount.R create mode 100644 R/utils_for_countdata.R create mode 100644 inst/testfiles/Actiwatch.AWD create mode 100644 inst/testfiles/Actiwatch.csv create mode 100644 man/readActiwatchCount.Rd create mode 100644 tests/testthat/test_readActiwatchCount.R diff --git a/NAMESPACE b/NAMESPACE index f5834ae..0a310ba 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,6 @@ export(readGenea, readAxivity, readGENEActiv, GENEActivReader, resample, readWav, - readActiGraphCount) + readActiGraphCount, readActiwatchCount) useDynLib(GGIRread, .registration = TRUE) importFrom(Rcpp, sourceCpp) importFrom(data.table, fread) diff --git a/NEWS.md b/NEWS.md index 0f48dfd..891fe2d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,7 +2,8 @@ - Added a `NEWS.md` file to track changes to the package. - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. -- Migrate read function for ActiGraph count data (csv) to GGIRread #68. +- Migrate read function for ActiGraph (csv) and Actiwatch (csv/awd) count data to GGIRread #68. + # Changes in version 1.0.1 (release date:03-06-2024) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R index 4f3c3d7..20060f4 100644 --- a/R/readActiGraphCount.R +++ b/R/readActiGraphCount.R @@ -1,6 +1,8 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, - timeformat = "%m/%d/%Y %H:%M:%S", tz = "") { + timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { + # In GGIR set timeformatName to extEpochData_timeformat deviceSerialNumber = NULL + # Test if file has header by reading first ten rows # and checking whether it contains the word # serial number. @@ -147,11 +149,11 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, } } # Check timestamp is meaningful - if (all(is.na(timestamp_POSIX))) { - stop(paste0("\nTime format in data ", timestamp, " does not match with time format ", - timeformat, - " as specified by argument extEpochData_timeformat, please correct.\n")) - } + checkTimeFormat(timestamp_POSIX = timestamp_POSIX, rawValue = timestamp[1], + timeformat = timeformat, + timeformatName = timeformatName) + + # If requested, aggregate data to lower resolution to match desired # epoch size in argument windowsizes if (!is.null(desiredEpochSize)) { @@ -163,12 +165,7 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, D = apply(D, 2, diff) epSizeShort = epSizeShort * step } - if (epSizeShort != desiredEpochSize) { - stop(paste0("\nThe short epoch size as specified by the user as the first value of argument windowsizes (", - desiredEpochSize, - " seconds) does NOT match the short epoch size we see in the data (", epSizeShort), - " seconds). Please correct.", call. = FALSE) - } + checkEpochMatch(desiredEpochSize, epSizeShort) } invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX, diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R new file mode 100644 index 0000000..0a351bf --- /dev/null +++ b/R/readActiwatchCount.R @@ -0,0 +1,129 @@ +readActiwatchCount = function(filename = file, desiredEpochSize = NULL, + timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { + # In GGIR set timeformatName to extEpochData_timeformat + + fileExtension = tolower(getExtension(filename)) + + if (fileExtension == "csv") { + #========================================================= + # CSV + #========================================================= + # ! Assumptions that timeseries start before line 1000 + index = 1000 + while (index > 0) { + quote = detectQuote(fn = filename, index = index) + testraw = data.table::fread(input = filename, + header = FALSE, sep = ",", skip = index, + nrows = 2, data.table = FALSE, quote = quote) + if (length(testraw) > 0) { + if (nrow(testraw) == 2) { + if (testraw$V1[2] == testraw$V1[1] + 1) { + break + } + } + } + index = index - 100 + } + # ! Assumption that first column are the epoch numbers + delta = 1 - testraw$V1[1] + index = index + delta + startFound = FALSE + while (startFound == FALSE) { + Dtest = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, nrows = 1) + if (Dtest$V1[1] == 1) { + startFound = TRUE + } else { + # This happens when file is has an empty row between each measurement point is stored + index = index - 1 + if (index < 1) stop("Could not find start of recording", call. = FALSE) + } + } + D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote) + # ! Assumption that column names are present 2 lines prior to timeseries + colnames = data.table::fread(input = filename, + header = FALSE, sep = ",", + skip = index - 2, nrows = 1, quote = quote) + if (all(is.na(colnames))) { + colnames = data.table::fread(input = filename, + header = FALSE, sep = ",", + skip = index - 4, nrows = 1, quote = quote) + } + colnames(D) = as.character(colnames)[1:ncol(D)] + # ! Assumptions about columns names + colnames(D) = gsub(pattern = "datum|date", replacement = "date", x = colnames(D), ignore.case = TRUE) + colnames(D) = gsub(pattern = "tijd|time", replacement = "time", x = colnames(D), ignore.case = TRUE) + colnames(D) = gsub(pattern = "activiteit|activity", replacement = "ZCY", x = colnames(D), ignore.case = TRUE) + timestamp_POSIX = as.POSIXct(x = paste(D$date[1:4], D$time[1:4], sep = " "), + format = timeformat, + tz = tz) + checkTimeFormat(timestamp_POSIX[1], + rawValue = paste(D$date[1], D$time[1], sep = " "), + timeformat = timeformat, + timeformatName = timeformatName) + epSizeShort = mean(diff(as.numeric(timestamp_POSIX))) + + timestamp_POSIX = timestamp_POSIX[1] + D = D[, "ZCY"] + } else if (fileExtension == "awd") { + #========================================================= + # AWD + #========================================================= + # ! Assumption that first data row equals the first row with 3 columns + index = 0 + + quote = detectQuote(fn = filename, index = 50) + NC = 1 + while (NC >= 3) { + testraw = data.table::fread(input = filename, + header = FALSE, sep = ",", skip = index, + nrows = 1, data.table = TRUE, quote = quote) + NC = ncol(testraw) + if (NC >= 3) { + break() + } else { + index = index + 1 + } + } + D = data.table::fread(input = filename, header = FALSE, sep = ",", + skip = index, quote = quote) + D = D[,1] + colnames(D)[1] = "ZCY" + header = data.table::fread(input = filename, header = FALSE, sep = ",", + nrows = 7, quote = quote) + # Get epoch size + optionalEpochs = data.frame(code = c("1", "2", "4", "8", "20", "81", "C1", "C2"), + size = c(15, 30, 60, 120, 300, 2, 5, 10)) + epSizeShort = optionalEpochs$size[which(optionalEpochs$code == as.character(header[4]))] + # Get starttime + timestampFormat = paste0(unlist(strsplit(timeformat, " "))[1], " %H:%M") + timestamp_POSIX = as.POSIXct(x = paste(header[2], header[3], sep = " "), + format = timestampFormat, tz = tz) + checkTimeFormat(timestamp_POSIX, + rawValue = header[2], + timeformat = timeformat, + timeformatName = timeformatName) + + } + D = as.matrix(D, drop = FALSE) + + # If requested, aggregate data to lower resolution to match desired + # epoch size in argument windowsizes + if (!is.null(desiredEpochSize)) { + if (desiredEpochSize > epSizeShort) { + step = desiredEpochSize %/% epSizeShort + D = rbind(rep(0, ncol(D)), D) + cumsum2 = function(x) { + x = cumsum(ifelse(is.na(x), 0, x)) + x*0 + return(x) + } + D = apply(D, 2, cumsum2) + D = D[seq(1, nrow(D), by = step), , drop = FALSE] + D = apply(D, 2, diff) + epSizeShort = epSizeShort * step + } + checkEpochMatch(desiredEpochSize, epSizeShort) + } + if (quote == "") D$ZCY = as.numeric(D$ZCY) + invisible(list(data = D, epochSize = epSizeShort, + startTime = timestamp_POSIX)) +} \ No newline at end of file diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R new file mode 100644 index 0000000..34ce7ce --- /dev/null +++ b/R/utils_for_countdata.R @@ -0,0 +1,45 @@ +# Collection of short function used in functions readActigraphCount, readActiwatchCount +checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? ", + timeformatName = NULL) { + if (is.na(timestamp_POSIX)) { + stop(paste0("\nTime format in data ", rawValue, + " does not match with time format ", timeformat, + " as specified by argument ", timeformatName, + ", please correct.\n"), call. = FALSE) + } +} + +checkEpochMatch = function(desiredEpochSize, epSizeShort) { + if (!is.null(desiredEpochSize) && epSizeShort != desiredEpochSize) { + stop(paste0("\nThe short epoch size as specified by the user (", + desiredEpochSize, " seconds) does NOT match the short", + " epoch size we see in the data (", epSizeShort, + " seconds). Please correct."), call. = FALSE) + } + return() +} + +detectQuote = function(fn, index) { + # data.table::fread has argument quote. + # On some computers the quotes in the files are + # not recognised, to catch this first try to check whether this is the case: + quote = "\"" + Dtest = NULL + try(expr = {Dtest = data.table::fread(input = fn, + header = FALSE, sep = ",", skip = index, + nrows = 20, quote = quote)}, silent = TRUE) + if (length(Dtest) == 0) { + quote = "" + } else { + if (nrow(Dtest) <= 1) { + quote = "" + } + } + return(quote) +} + +getExtension <- function(filename){ + ex <- unlist(strsplit(basename(filename), split = "[.]")) + if (length(ex) < 2) stop(paste0("Cannot recognise extension from '", filename, "' as filename, please check"), call. = FALSE) + return(ex[-1]) +} \ No newline at end of file diff --git a/inst/testfiles/Actiwatch.AWD b/inst/testfiles/Actiwatch.AWD new file mode 100644 index 0000000..4f1121c --- /dev/null +++ b/inst/testfiles/Actiwatch.AWD @@ -0,0 +1,336 @@ +0123456701102009 +01-Oct-2009 +17:00 + 4 +0 +D012345 +M +0 , 0,00 +498 , 0,00 M +394 , 0,00 +666 , 0,00 +262 , 0,00 +14 , 0,00 +358 , 0,00 +711 , 0,00 +549 , 0,00 +465 , 0,00 +148 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +4 , 0,00 +0 , 0,00 +0 , 0,00 +2 , 0,00 +102 , 0,00 +45 , 0,00 +782 , 0,00 +949 , 0,00 +918 , 0,00 +1113 , 0,00 +733 , 0,00 +949 , 0,00 +733 , 0,00 +861 , 0,00 +809 , 0,00 +666 , 0,00 +626 , 0,00 +394 , 0,00 +345 , 0,00 +382 , 0,00 +666 , 0,00 +782 , 0,00 +106 , 0,00 +626 , 0,00 +498 , 0,00 +1187 , 0,00 +758 , 0,00 +646 , 0,00 +861 , 0,00 +809 , 0,00 +733 , 0,00 +498 , 0,00 +465 , 0,00 +809 , 0,00 +1390 , 0,00 +782 , 0,00 +979 , 0,00 +382 , 0,00 +890 , 0,00 +711 , 0,00 +758 , 0,00 +482 , 0,00 +126 , 0,00 +33 , 0,00 +345 , 0,00 +118 , 0,00 +246 , 0,00 +345 , 0,00 +451 , 0,00 +1079 , 0,00 +1150 , 0,00 +585 , 0,00 +423 , 0,00 +358 , 0,00 +890 , 0,00 +666 , 0,00 +1264 , 0,00 +1012 , 0,00 +549 , 0,00 +2 , 0,00 +8 , 0,00 +0 , 0,00 +0 , 0,00 +262 , 0,00 +8 , 0,00 +0 , 0,00 +0 , 0,00 +33 , 0,00 +89 , 0,00 +213 , 0,00 +57 , 0,00 +53 , 0,00 +465 , 0,00 +358 , 0,00 +10 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +14 , 0,00 +0 , 0,00 +0 , 0,00 +2 , 0,00 +16 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +2 , 0,00 +8 , 0,00 +758 , 0,00 +585 , 0,00 +4 , 0,00 +12 , 0,00 +18 , 0,00 +16 , 0,00 +28 , 0,00 +33 , 0,00 +0 , 0,00 +0 , 0,00 +16 , 0,00 +18 , 0,00 +18 , 0,00 +142 , 0,00 +303 , 0,00 +161 , 0,00 +0 , 0,00 +22 , 0,00 +63 , 0,00 +73 , 0,00 +0 , 0,00 +2 , 0,00 +16 , 0,00 +30 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +173 , 0,00 +530 , 0,00 +835 , 0,00 +711 , 0,00 +293 , 0,00 +423 , 0,00 +333 , 0,00 +394 , 0,00 +2 , 0,00 +303 , 0,00 +333 , 0,00 +254 , 0,00 +57 , 0,00 +22 , 0,00 +465 , 0,00 +106 , 0,00 +85 , 0,00 +81 , 0,00 +20 , 0,00 +4 , 0,00 +93 , 0,00 +197 , 0,00 +272 , 0,00 +39 , 0,00 +20 , 0,00 +0 , 0,00 +6 , 0,00 +2 , 0,00 +85 , 0,00 +0 , 0,00 +148 , 0,00 +89 , 0,00 +161 , 0,00 +24 , 0,00 +16 , 0,00 +0 , 0,00 +102 , 0,00 +53 , 0,00 +0 , 0,00 +4 , 0,00 +8 , 0,00 +221 , 0,00 +394 , 0,00 +835 , 0,00 +809 , 0,00 +465 , 0,00 +345 , 0,00 +130 , 0,00 +333 , 0,00 +77 , 0,00 +85 , 0,00 +154 , 0,00 +0 , 0,00 +213 , 0,00 +81 , 0,00 +33 , 0,00 +0 , 0,00 +43 , 0,00 +167 , 0,00 +238 , 0,00 +646 , 0,00 +408 , 0,00 +282 , 0,00 +126 , 0,00 +154 , 0,00 +106 , 0,00 +0 , 0,00 +358 , 0,00 +246 , 0,00 +89 , 0,00 +126 , 0,00 +437 , 0,00 +213 , 0,00 +1012 , 0,00 +1577 , 0,00 +1845 , 0,00 +73 , 0,00 +81 , 0,00 +69 , 0,00 +89 , 0,00 +26 , 0,00 +106 , 0,00 +221 , 0,00 +0 , 0,00 +0 , 0,00 +2 , 0,00 +282 , 0,00 +0 , 0,00 +0 , 0,00 +498 , 0,00 +530 , 0,00 +77 , 0,00 +809 , 0,00 +3448 , 0,00 +4029 , 0,00 +1150 , 0,00 +1434 , 0,00 +1225 , 0,00 +59 , 0,00 +55 , 0,00 +0 , 0,00 +81 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +0 , 0,00 +106 , 0,00 +61 , 0,00 +0 , 0,00 +126 , 0,00 +1264 , 0,00 +979 , 0,00 +758 , 0,00 +37 , 0,00 +646 , 0,00 +949 , 0,00 +949 , 0,00 +918 , 0,00 +711 , 0,00 +809 , 0,00 +179 , 0,00 +293 , 0,00 +585 , 0,00 +49 , 0,00 +18 , 0,00 +61 , 0,00 +205 , 0,00 +8 , 0,00 +22 , 0,00 +110 , 0,00 +154 , 0,00 +173 , 0,00 +61 , 0,00 +10 , 0,00 +65 , 0,00 +333 , 0,00 +465 , 0,00 +949 , 0,00 +809 , 0,00 +238 , 0,00 +93 , 0,00 +130 , 0,00 +303 , 0,00 +221 , 0,00 +179 , 0,00 +585 , 0,00 +22 , 0,00 +41 , 0,00 +65 , 0,00 +24 , 0,00 +16 , 0,00 +0 , 0,00 +18 , 0,00 +93 , 0,00 +43 , 0,00 +69 , 0,00 +39 , 0,00 +12 , 0,00 +20 , 0,00 +0 , 0,00 +28 , 0,00 +26 , 0,00 +110 , 0,00 +65 , 0,00 +514 , 0,00 +81 , 0,00 +758 , 0,00 +782 , 0,00 +890 , 0,00 +1113 , 0,00 +626 , 0,00 +549 , 0,00 +809 , 0,00 +567 , 0,00 +733 , 0,00 +758 , 0,00 +711 , 0,00 +549 , 0,00 +293 , 0,00 +437 , 0,00 M +303 , 0,00 +47 , 0,00 +254 , 0,00 +437 , 0,00 +646 , 0,00 +1304 , 0,00 +782 , 0,00 +549 , 0,00 +530 , 0,00 +465 , 0,00 +313 , 0,00 +408 , 0,00 +14 , 0,00 +45 , 0,00 +18 , 0,00 +47 , 0,00 +41 , 0,00 \ No newline at end of file diff --git a/inst/testfiles/Actiwatch.csv b/inst/testfiles/Actiwatch.csv new file mode 100644 index 0000000..f181658 --- /dev/null +++ b/inst/testfiles/Actiwatch.csv @@ -0,0 +1,1010 @@ +Actiware-exportbestand (versie 05.00),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Bestandsnaam:,C:\Users\myfile.csv,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Naam analyse:,Nieuwe analyse,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +-------------------- Subjecteigenschappen--------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Identiteit:,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Voorletters:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Volledige naam:,Niet ingevuld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Adres:,Niet ingevuld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Plaats Staat/provincie Postcode Land:,Niet ingevuld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Telefoon:,Niet ingevuld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Geslacht:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Geboortedatum:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Leeftijd (bij maken van exportbestand):,,jaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Leeftijd (bij begin gegevensverzameling):,,jaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +----------------- Actiwatch-gegevenseigenschappen ----------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Type Actiwatch:,Spectrum Plus,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Begindatum gegevensverzameling:,23/11/2019,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Begintijd gegevensverzameling:,06:00:00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Einddatum gegevensverzameling:,30/11/2019,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Eindtijd gegevensverzameling:,06:00:00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Registratiemodus:,Alleen activiteit,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Tijdzone:,"(UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Tijdzone-offset:,+01:00,uren:minuten,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Periodelengte:,15,seconden,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Aantal gegevenssamples:,40320,steekproeven,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Aantal gegevenssteekproeven per dag:,5760,steekproeven per dag,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Aantal dagen:,"7,00",dagen,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Datum batterij geïnstalleerd:,Niet beschikbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Aantal processorresets:,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Serienummer Actiwatch:,P66732,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Actiwatch-firmwareversie:,01.00.0012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kalibratiefactor activiteit:,85,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kalibratiefactor wit:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kalibratiefactor rood:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kalibratiefactor groen:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kalibratiefactor blauw:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kalibratiefactor terugzetten:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Scoremodus:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Parameter A:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Parameter B:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +--------------------- Analyse-invoeren ----------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Waakdrempelselectie:,Gemiddeld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Waakdrempelwaarde:,"40,00",aantal activiteiten,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Slaapintervaldetectie-algoritme,Op minuten gescoord als onbeweeglijk,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Instelling aanvang slaap:,10,minuten,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Instelling einde van slaap:,10,minuten,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Beginuur Actogram,12:00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Drempel wit licht:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Drempel rood licht:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Drempel groen licht:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Drempel blauw licht:,Niet toepasbaar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +------------------------ Statistieken ------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Intervaltype,Intervalnr.,Begindatum,Begindag,Begintijd,Einddatum,Einddag,Eindtijd,Duur,Niet-om-pols,%Niet-om-pols,Totaal AC,Gem AC/min,Gem AC/periode,Std AC,Max AC,Ong. tijd AC,%Ongeldig AC,Ong. tijd SW,%Ongeldig SW,Latentietijd,Sluimertijd,Efficiëntie,WASO,Waaktijd,%Waken,#Waakvoorvallen,Gem. waak,Slaaptijd,%Slapen,#Slaapvoorvallen,Gem. slaap,Tijd bewegingsloos,%Onbeweeglijk,Aant. onbew.,Gem Onbew-episode,Tijd beweging,%Beweeglijk,Aant. bew.,Gem Bew-episode,Aant. 1min onbew,%1min onbew,Fragmentatie +,,,,,,,,(minuten),(minuten),(%),(aantal),(aantal/minuut),(aantal/periode),(aantal/periode),(aantal),(minuten),(%),(minuten),(%),(minuten),(minuten),(%),(minuten),(minuten),(%),,(minuten),(minuten),(%),,(minuten),(minuten),(%),,(minuten),(minuten),(%),,(minuten),,(%),(%+%) +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +RUST,1,23/11/2019,za,20:42:15,24/11/2019,zo,08:05:30,"683,25","0,00","0,00",12072,"17,67","4,42","30,36",482,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"53,75","7,87",62,"0,87","629,50","92,13",63,"9,99","642,25","94,00",90,"7,14","41,00","6,00",89,"0,46",5,"5,56","11,56" +RUST,2,24/11/2019,zo,19:56:00,25/11/2019,ma,08:06:15,"730,25","0,00","0,00",20217,"27,69","6,92","38,21",452,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"75,50","10,34",83,"0,91","654,75","89,66",84,"7,79","670,75","91,85",118,"5,68","59,50","8,15",117,"0,51",6,"5,08","13,23" +RUST,3,25/11/2019,ma,20:28:45,26/11/2019,di,07:56:30,"687,75","0,00","0,00",17830,"25,93","6,48","33,87",514,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"69,75","10,14",91,"0,77","618,00","89,86",92,"6,72","623,50","90,66",139,"4,49","64,25","9,34",138,"0,47",12,"8,63","17,98" +RUST,4,26/11/2019,di,20:12:45,27/11/2019,wo,07:29:30,"676,75","0,00","0,00",13739,"20,30","5,08","30,73",411,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"67,00","9,90",80,"0,84","609,75","90,10",81,"7,53","625,25","92,39",117,"5,34","51,50","7,61",116,"0,44",6,"5,13","12,74" +RUST,5,27/11/2019,wo,20:59:00,28/11/2019,do,08:04:45,"665,75","0,00","0,00",9854,"14,80","3,70","24,75",438,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"44,50","6,68",64,"0,70","621,25","93,32",64,"9,71","625,50","93,95",104,"6,01","40,25","6,05",103,"0,39",2,"1,92","7,97" +RUST,6,28/11/2019,do,19:43:15,29/11/2019,vr,07:37:15,"714,00","0,00","0,00",11913,"16,68","4,17","25,61",548,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"52,75","7,39",85,"0,62","661,25","92,61",86,"7,69","662,00","92,72",123,"5,38","52,00","7,28",123,"0,42",8,"6,50","13,79" +Rust-overzicht,n,NaN,NaN,NaN,NaN,NaN,NaN,6,6,6,6,6,6,6,6,6,6,6,6,NaN,NaN,NaN,NaN,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 +Rust-overzicht,Minimum(n),NaN,NaN,NaN,NaN,NaN,NaN,"665,75","0,00","0,00",9854,"14,80","3,70","24,75",411,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"44,50","6,68",62,"0,62","609,75","89,66",63,"6,72","623,50","90,66",90,"4,49","40,25","6,00",89,"0,39",2,"1,92","7,97" +Rust-overzicht,Maximum(n),NaN,NaN,NaN,NaN,NaN,NaN,"730,25","0,00","0,00",20217,"27,69","6,92","38,21",548,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"75,50","10,34",91,"0,91","661,25","93,32",92,"9,99","670,75","94,00",139,"7,14","64,25","9,34",138,"0,51",12,"8,63","17,98" +Rust-overzicht,Gemiddelde(n),NaN,NaN,NaN,NaN,NaN,NaN,"692,96","0,00","0,00","14270,83","20,51","5,13","30,59","474,17","0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"60,54","8,72","77,50","0,78","632,42","91,28","78,33","8,24","641,54","92,60","115,17","5,67","51,42","7,40","114,33","0,45","6,50","5,47","12,88" +Rust-overzicht,Std afw(n-1),NaN,NaN,NaN,NaN,NaN,NaN,"24,32","0,00","0,00","3955,00","5,22","1,30","5,06","50,77","0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"11,95","1,59","11,81","0,11","20,90","1,59","12,04","1,31","20,59","1,28","16,73","0,88","9,63","1,28","16,82","0,04","3,33","2,19","3,25" +ACTIEF,1,23/11/2019,za,06:00:00,23/11/2019,za,20:42:15,"882,25","199,25","22,58",222289,"325,46","81,36","91,06",752,"199,25","22,58","200,25","22,70",NaN,NaN,NaN,NaN,"652,25","95,64",55,"11,86","29,75","4,36",54,"0,55","87,75","12,85",219,"0,40","595,25","87,15",220,"2,71",3,"1,37","88,52" +ACTIEF,2,24/11/2019,zo,08:05:30,24/11/2019,zo,19:56:00,"710,50","0,00","0,00",250523,"352,60","88,15","83,27",706,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"676,75","95,25",61,"11,09","33,75","4,75",61,"0,55","72,00","10,13",173,"0,42","638,50","89,87",172,"3,71",7,"4,05","93,91" +ACTIEF,3,25/11/2019,ma,08:06:15,25/11/2019,ma,20:28:45,"742,50","0,00","0,00",310715,"418,47","104,62","85,79",548,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"741,00","99,80",4,"185,25","1,50","0,20",4,"0,38","53,25","7,17",159,"0,33","689,25","92,83",159,"4,33",4,"2,52","95,34" +ACTIEF,4,26/11/2019,di,07:56:30,26/11/2019,di,20:12:45,"736,25","0,00","0,00",297469,"404,03","101,01","84,89",622,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"728,75","98,98",15,"48,58","7,50","1,02",15,"0,50","68,25","9,27",205,"0,33","668,00","90,73",205,"3,26",1,"0,49","91,22" +ACTIEF,5,27/11/2019,wo,07:29:30,27/11/2019,wo,20:59:00,"809,50","0,00","0,00",376833,"465,51","116,38","92,44",853,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"801,50","99,01",15,"53,43","8,00","0,99",15,"0,53","62,50","7,72",197,"0,32","747,00","92,28",196,"3,81",4,"2,03","94,31" +ACTIEF,6,28/11/2019,do,08:04:45,28/11/2019,do,19:43:15,"698,50","13,75","1,97",331710,"484,43","121,11","94,61",663,"13,75","1,97","15,75","2,25",NaN,NaN,NaN,NaN,"678,25","99,34",10,"67,83","4,50","0,66",9,"0,50","12,50","1,83",42,"0,30","672,25","98,17",43,"15,63",0,"0,00","98,17" +ACTIEF,7,29/11/2019,vr,07:37:15,30/11/2019,za,06:00:00,"1342,75","13,00","0,97",326819,"245,77","61,44","77,08",642,"13,00","0,97","17,25","1,28",NaN,NaN,NaN,NaN,"807,50","60,92",62,"13,02","518,00","39,08",61,"8,49","569,50","42,83",236,"2,41","760,25","57,17",237,"3,21",3,"1,27","58,44" +Actief-overzicht,n,NaN,NaN,NaN,NaN,NaN,NaN,7,7,7,7,7,7,7,7,7,7,7,7,NaN,NaN,NaN,NaN,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 +Actief-overzicht,Minimum(n),NaN,NaN,NaN,NaN,NaN,NaN,"698,50","0,00","0,00",222289,"245,77","61,44","77,08",548,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"652,25","60,92",4,"11,09","1,50","0,20",4,"0,38","12,50","1,83",42,"0,30","595,25","57,17",43,"2,71",0,"0,00","58,44" +Actief-overzicht,Maximum(n),NaN,NaN,NaN,NaN,NaN,NaN,"1342,75","199,25","22,58",376833,"484,43","121,11","94,61",853,"199,25","22,58","200,25","22,70",NaN,NaN,NaN,NaN,"807,50","99,80",62,"185,25","518,00","39,08",61,"8,49","569,50","42,83",236,"2,41","760,25","98,17",237,"15,63",7,"4,05","98,17" +Actief-overzicht,Gemiddelde(n),NaN,NaN,NaN,NaN,NaN,NaN,"846,04","32,29","3,65","302336,90","385,18","96,30","87,02","683,71","32,29","3,65","33,32","3,75",NaN,NaN,NaN,NaN,"726,57","92,71","31,71","55,87","86,14","7,29","31,29","1,64","132,25","13,11","175,86","0,64","681,50","86,89","176,00","5,24","3,14","1,67","88,56" +Actief-overzicht,Std afw(n-1),NaN,NaN,NaN,NaN,NaN,NaN,"228,14","73,89","8,38","51958,41","83,49","20,87","6,09","98,50","73,89","8,38","74,02","8,40",NaN,NaN,NaN,NaN,"61,53","14,14","26,19","61,53","190,85","14,14","25,99","3,02","194,23","13,53","64,53","0,78","57,89","13,53","64,41","4,61","2,27","1,35","13,63" +SLAAP,1,23/11/2019,za,20:59:45,24/11/2019,zo,08:05:15,"665,50","0,00","0,00",11828,"17,77","4,44","30,69",482,"0,00","0,00","0,00","0,00","17,50","0,25","89,72","52,50","52,50","7,89",58,"0,91","613,00","92,11",59,"10,39","626,75","94,18",83,"7,55","38,75","5,82",82,"0,47",4,"4,82","10,64" +SLAAP,2,24/11/2019,zo,20:23:45,25/11/2019,ma,08:06:00,"702,25","0,00","0,00",19771,"28,15","7,04","38,82",452,"0,00","0,00","0,00","0,00","27,75","0,25","86,31","72,00","72,00","10,25",73,"0,99","630,25","89,75",74,"8,52","647,50","92,20",103,"6,29","54,75","7,80",102,"0,54",4,"3,88","11,68" +SLAAP,3,25/11/2019,ma,21:10:45,26/11/2019,di,07:41:45,"631,00","0,00","0,00",16291,"25,82","6,45","34,77",514,"0,00","0,00","0,00","0,00","42,00","14,75","83,13","59,25","59,25","9,39",69,"0,86","571,75","90,61",69,"8,29","579,50","91,84",103,"5,63","51,50","8,16",103,"0,50",4,"3,88","12,05" +SLAAP,4,26/11/2019,di,20:47:15,27/11/2019,wo,07:19:00,"631,75","0,00","0,00",11524,"18,24","4,56","29,57",411,"0,00","0,00","0,00","0,00","34,50","10,50","85,78","51,25","51,25","8,11",64,"0,80","580,50","91,89",65,"8,93","594,50","94,10",85,"6,99","37,25","5,90",84,"0,44",5,"5,88","11,78" +SLAAP,5,27/11/2019,wo,21:39:15,28/11/2019,do,08:03:00,"623,75","0,00","0,00",8689,"13,93","3,48","24,81",438,"0,00","0,00","0,00","0,00","40,25","1,75","88,17","36,75","36,75","5,89",50,"0,74","587,00","94,11",50,"11,74","592,00","94,91",77,"7,69","31,75","5,09",76,"0,42",1,"1,30","6,39" +SLAAP,6,28/11/2019,do,20:23:00,29/11/2019,vr,06:39:30,"616,50","0,00","0,00",8578,"13,91","3,48","23,15",548,"0,00","0,00","0,00","0,00","39,75","57,75","81,02","38,00","38,00","6,16",56,"0,68","578,50","93,84",57,"10,15","580,00","94,08",84,"6,90","36,50","5,92",83,"0,44",3,"3,57","9,49" +Slaap-overzicht,n,NaN,NaN,NaN,NaN,NaN,NaN,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 +Slaap-overzicht,Minimum(n),NaN,NaN,NaN,NaN,NaN,NaN,"616,50","0,00","0,00",8578,"13,91","3,48","23,15",411,"0,00","0,00","0,00","0,00","17,50","0,25","81,02","36,75","36,75","5,89",50,"0,68","571,75","89,75",50,"8,29","579,50","91,84",77,"5,63","31,75","5,09",76,"0,42",1,"1,30","6,39" +Slaap-overzicht,Maximum(n),NaN,NaN,NaN,NaN,NaN,NaN,"702,25","0,00","0,00",19771,"28,15","7,04","38,82",548,"0,00","0,00","0,00","0,00","42,00","57,75","89,72","72,00","72,00","10,25",73,"0,99","630,25","94,11",74,"11,74","647,50","94,91",103,"7,69","54,75","8,16",103,"0,54",5,"5,88","12,05" +Slaap-overzicht,Gemiddelde(n),NaN,NaN,NaN,NaN,NaN,NaN,"645,13","0,00","0,00","12780,17","19,64","4,91","30,30","474,17","0,00","0,00","0,00","0,00","33,63","14,21","85,69","51,63","51,63","7,95","61,67","0,83","593,50","92,05","62,33","9,67","603,38","93,55","89,17","6,84","41,75","6,45","88,33","0,47","3,50","3,89","10,34" +Slaap-overzicht,Std afw(n-1),NaN,NaN,NaN,NaN,NaN,NaN,"32,66","0,00","0,00","4428,95","6,02","1,51","5,91","50,77","0,00","0,00","0,00","0,00","9,45","22,16","3,20","13,27","13,27","1,72","8,59","0,11","22,98","1,72","8,71","1,33","27,63","1,23","11,07","0,78","9,17","1,23","11,33","0,04","1,38","1,53","2,15" +DAGELIJKS,1,23/11/2019,za,06:00:00,23/11/2019,za,12:00:00,"360,00","199,25","55,35",44649,"277,75","69,44","75,16",438,"199,25","55,35","200,25","55,63",NaN,NaN,NaN,NaN,"153,25","95,93",15,"10,22","6,50","4,07",15,"0,43","25,25","15,71",72,"0,35","135,50","84,29",72,"1,88",0,"0,00","84,29" +DAGELIJKS,2,23/11/2019,za,12:00:00,24/11/2019,zo,12:00:00,"1440,00","0,00","0,00",272503,"189,24","47,31","80,79",752,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"770,75","53,52",135,"5,71","669,25","46,48",134,"4,99","727,50","50,52",282,"2,58","712,50","49,48",283,"2,52",9,"3,19","52,67" +DAGELIJKS,3,24/11/2019,zo,12:00:00,25/11/2019,ma,12:00:00,"1440,00","0,00","0,00",307236,"213,36","53,34","80,84",706,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"767,75","53,32",113,"6,79","672,25","46,68",112,"6,00","722,25","50,16",249,"2,90","717,75","49,84",250,"2,87",12,"4,82","54,66" +DAGELIJKS,4,25/11/2019,ma,12:00:00,26/11/2019,di,12:00:00,"1440,00","0,00","0,00",339212,"235,56","58,89","83,73",622,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"820,50","56,98",96,"8,55","619,50","43,02",95,"6,52","683,50","47,47",318,"2,15","756,50","52,53",319,"2,37",15,"4,72","57,25" +DAGELIJKS,5,26/11/2019,di,12:00:00,27/11/2019,wo,12:00:00,"1440,00","0,00","0,00",345974,"240,26","60,06","85,11",684,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"822,50","57,12",97,"8,48","617,50","42,88",96,"6,43","689,50","47,88",307,"2,25","750,50","52,12",308,"2,44",6,"1,95","54,07" +DAGELIJKS,6,27/11/2019,wo,12:00:00,28/11/2019,do,12:00:00,"1440,00","0,00","0,00",339056,"235,46","58,86","84,66",853,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"811,00","56,32",79,"10,27","629,00","43,68",78,"8,06","684,75","47,55",289,"2,37","755,25","52,45",290,"2,60",5,"1,73","54,18" +DAGELIJKS,7,28/11/2019,do,12:00:00,29/11/2019,vr,12:00:00,"1440,00","26,75","1,86",340821,"241,16","60,29","86,57",663,"26,75","1,86","31,00","2,15",NaN,NaN,NaN,NaN,"743,25","52,75",97,"7,66","665,75","47,25",94,"7,08","685,00","48,47",198,"3,46","728,25","51,53",201,"3,62",8,"4,04","55,57" +DAGELIJKS,8,29/11/2019,vr,12:00:00,30/11/2019,za,06:00:00,"1080,00","0,00","0,00",212532,"196,79","49,20","74,21",642,"0,00","0,00","2,00","0,19",NaN,NaN,NaN,NaN,"560,25","51,97",61,"9,18","517,75","48,03",60,"8,63","557,25","51,60",200,"2,79","522,75","48,40",199,"2,63",3,"1,50","49,90" +Dagelijks-overzicht,n,NaN,NaN,NaN,NaN,NaN,NaN,8,8,8,8,8,8,8,8,8,8,8,8,NaN,NaN,NaN,NaN,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 +Dagelijks-overzicht,Minimum(n),NaN,NaN,NaN,NaN,NaN,NaN,"360,00","0,00","0,00",44649,"189,24","47,31","74,21",438,"0,00","0,00","0,00","0,00",NaN,NaN,NaN,NaN,"153,25","51,97",15,"5,71","6,50","4,07",15,"0,43","25,25","15,71",72,"0,35","135,50","48,40",72,"1,88",0,"0,00","49,90" +Dagelijks-overzicht,Maximum(n),NaN,NaN,NaN,NaN,NaN,NaN,"1440,00","199,25","55,35",345974,"277,75","69,44","86,57",853,"199,25","55,35","200,25","55,63",NaN,NaN,NaN,NaN,"822,50","95,93",135,"10,27","672,25","48,03",134,"8,63","727,50","51,60",318,"3,46","756,50","84,29",319,"3,62",15,"4,82","84,29" +Dagelijks-overzicht,Gemiddelde(n),NaN,NaN,NaN,NaN,NaN,NaN,"1260,00","28,25","7,15","275247,90","228,70","57,17","81,38","670,00","28,25","7,15","29,16","7,25",NaN,NaN,NaN,NaN,"681,16","59,74","86,62","8,36","549,69","40,26","85,50","6,02","596,88","44,92","239,38","2,36","634,88","55,08","240,25","2,62","7,25","2,74","57,83" +Dagelijks-overzicht,Std afw(n-1),NaN,NaN,NaN,NaN,NaN,NaN,"384,86","69,73","19,49","103926,40","28,28","7,07","4,60","118,72","69,73","19,49","69,96","19,56",NaN,NaN,NaN,NaN,"229,58","14,76","36,22","1,59","225,08","14,76","35,86","2,53","236,85","11,90","81,42","0,91","215,87","11,90","81,71","0,50","4,83","1,72","10,91" +UITGEZONDERD,1,23/11/2019,za,06:00:00,23/11/2019,za,09:19:15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +UITGEZONDERD,2,28/11/2019,do,15:45:30,28/11/2019,do,15:59:15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +UITGEZONDERD,3,29/11/2019,vr,07:50:00,29/11/2019,vr,07:54:30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +UITGEZONDERD,4,29/11/2019,vr,07:54:45,29/11/2019,vr,08:03:15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +--------------------- Marker/score-overzicht --------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kolomtitel,Opmerkingen,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +------------------,---------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Lijn:,Regelnummer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Datum:,Datum (begin van periode),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Tijd:,Tijd (begin van periode),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Markering:,Markering! = Knop Gebeurtenismarkering werd ingedrukt,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Intervalstatus:,Intervalstatus: Actief; rust; slaap; of uitgezonderd,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Lijn,Datum,Tijd,Markering,Intervalstatus,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1,28/11/2019,08:09:00,Markering!,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +-------------------- Gegevens per-periode -------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Kolomtitel,Opmerkingen,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +------------------,---------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Lijn:,Regelnummer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Datum:,Datum (begin van periode),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Tijd:,Tijd (begin van periode),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Status niet-om-pols:,1 betekent apparaat werd niet gedragen,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Activiteit:,Activiteit (aantal),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Markering:,1 betekent dat knop Gebeurtenismarkering werd ingedrukt,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Slapen/waken:,Slaap-/waakscore (0=slapen; 1=waken),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Intervalstatus:,Intervalstatus: Actief; rust; slaap; of uitgezonderd,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Lijn,Datum,Tijd,Status niet-om-pols,Activiteit,Markering,Slapen/waken,Intervalstatus,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1,23/11/2019,06:00:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2,23/11/2019,06:00:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3,23/11/2019,06:00:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +4,23/11/2019,06:00:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5,23/11/2019,06:01:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6,23/11/2019,06:01:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7,23/11/2019,06:01:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8,23/11/2019,06:01:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9,23/11/2019,06:02:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10,23/11/2019,06:02:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11,23/11/2019,06:02:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12,23/11/2019,06:02:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13,23/11/2019,06:03:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +14,23/11/2019,06:03:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15,23/11/2019,06:03:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +16,23/11/2019,06:03:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17,23/11/2019,06:04:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +18,23/11/2019,06:04:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +19,23/11/2019,06:04:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +20,23/11/2019,06:04:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +21,23/11/2019,06:05:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +22,23/11/2019,06:05:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +23,23/11/2019,06:05:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +24,23/11/2019,06:05:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25,23/11/2019,06:06:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +26,23/11/2019,06:06:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27,23/11/2019,06:06:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +28,23/11/2019,06:06:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +29,23/11/2019,06:07:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30,23/11/2019,06:07:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +31,23/11/2019,06:07:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +32,23/11/2019,06:07:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33,23/11/2019,06:08:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +34,23/11/2019,06:08:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +35,23/11/2019,06:08:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36,23/11/2019,06:08:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37,23/11/2019,06:09:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +38,23/11/2019,06:09:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +39,23/11/2019,06:09:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +40,23/11/2019,06:09:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +41,23/11/2019,06:10:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +42,23/11/2019,06:10:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +43,23/11/2019,06:10:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44,23/11/2019,06:10:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +45,23/11/2019,06:11:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +46,23/11/2019,06:11:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +47,23/11/2019,06:11:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +48,23/11/2019,06:11:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49,23/11/2019,06:12:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +50,23/11/2019,06:12:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +51,23/11/2019,06:12:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +52,23/11/2019,06:12:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +53,23/11/2019,06:13:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +54,23/11/2019,06:13:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +55,23/11/2019,06:13:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +56,23/11/2019,06:13:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57,23/11/2019,06:14:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +58,23/11/2019,06:14:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +59,23/11/2019,06:14:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +60,23/11/2019,06:14:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +61,23/11/2019,06:15:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +62,23/11/2019,06:15:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +63,23/11/2019,06:15:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +64,23/11/2019,06:15:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +65,23/11/2019,06:16:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +66,23/11/2019,06:16:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +67,23/11/2019,06:16:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +68,23/11/2019,06:16:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +69,23/11/2019,06:17:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +70,23/11/2019,06:17:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +71,23/11/2019,06:17:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +72,23/11/2019,06:17:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +73,23/11/2019,06:18:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +74,23/11/2019,06:18:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +75,23/11/2019,06:18:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +76,23/11/2019,06:18:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +77,23/11/2019,06:19:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +78,23/11/2019,06:19:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +79,23/11/2019,06:19:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +80,23/11/2019,06:19:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +81,23/11/2019,06:20:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +82,23/11/2019,06:20:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +83,23/11/2019,06:20:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +84,23/11/2019,06:20:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +85,23/11/2019,06:21:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +86,23/11/2019,06:21:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +87,23/11/2019,06:21:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +88,23/11/2019,06:21:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +89,23/11/2019,06:22:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +90,23/11/2019,06:22:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +91,23/11/2019,06:22:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +92,23/11/2019,06:22:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +93,23/11/2019,06:23:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +94,23/11/2019,06:23:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +95,23/11/2019,06:23:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +96,23/11/2019,06:23:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +97,23/11/2019,06:24:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +98,23/11/2019,06:24:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +99,23/11/2019,06:24:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +100,23/11/2019,06:24:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +101,23/11/2019,06:25:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +102,23/11/2019,06:25:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +103,23/11/2019,06:25:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +104,23/11/2019,06:25:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +105,23/11/2019,06:26:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +106,23/11/2019,06:26:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +107,23/11/2019,06:26:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +108,23/11/2019,06:26:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +109,23/11/2019,06:27:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +110,23/11/2019,06:27:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +111,23/11/2019,06:27:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +112,23/11/2019,06:27:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +113,23/11/2019,06:28:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +114,23/11/2019,06:28:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +115,23/11/2019,06:28:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +116,23/11/2019,06:28:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +117,23/11/2019,06:29:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +118,23/11/2019,06:29:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +119,23/11/2019,06:29:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +120,23/11/2019,06:29:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +121,23/11/2019,06:30:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +122,23/11/2019,06:30:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +123,23/11/2019,06:30:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +124,23/11/2019,06:30:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +125,23/11/2019,06:31:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +126,23/11/2019,06:31:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +127,23/11/2019,06:31:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +128,23/11/2019,06:31:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +129,23/11/2019,06:32:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +130,23/11/2019,06:32:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +131,23/11/2019,06:32:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +132,23/11/2019,06:32:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +133,23/11/2019,06:33:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +134,23/11/2019,06:33:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +135,23/11/2019,06:33:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +136,23/11/2019,06:33:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +137,23/11/2019,06:34:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +138,23/11/2019,06:34:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +139,23/11/2019,06:34:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +140,23/11/2019,06:34:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +141,23/11/2019,06:35:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +142,23/11/2019,06:35:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +143,23/11/2019,06:35:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +144,23/11/2019,06:35:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +145,23/11/2019,06:36:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +146,23/11/2019,06:36:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +147,23/11/2019,06:36:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +148,23/11/2019,06:36:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +149,23/11/2019,06:37:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +150,23/11/2019,06:37:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +151,23/11/2019,06:37:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +152,23/11/2019,06:37:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +153,23/11/2019,06:38:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +154,23/11/2019,06:38:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +155,23/11/2019,06:38:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +156,23/11/2019,06:38:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +157,23/11/2019,06:39:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +158,23/11/2019,06:39:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +159,23/11/2019,06:39:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +160,23/11/2019,06:39:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +161,23/11/2019,06:40:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +162,23/11/2019,06:40:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +163,23/11/2019,06:40:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +164,23/11/2019,06:40:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +165,23/11/2019,06:41:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +166,23/11/2019,06:41:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +167,23/11/2019,06:41:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +168,23/11/2019,06:41:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +169,23/11/2019,06:42:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +170,23/11/2019,06:42:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +171,23/11/2019,06:42:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +172,23/11/2019,06:42:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +173,23/11/2019,06:43:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +174,23/11/2019,06:43:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +175,23/11/2019,06:43:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +176,23/11/2019,06:43:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +177,23/11/2019,06:44:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +178,23/11/2019,06:44:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +179,23/11/2019,06:44:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +180,23/11/2019,06:44:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +181,23/11/2019,06:45:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +182,23/11/2019,06:45:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +183,23/11/2019,06:45:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +184,23/11/2019,06:45:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +185,23/11/2019,06:46:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +186,23/11/2019,06:46:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +187,23/11/2019,06:46:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +188,23/11/2019,06:46:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +189,23/11/2019,06:47:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +190,23/11/2019,06:47:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +191,23/11/2019,06:47:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +192,23/11/2019,06:47:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +193,23/11/2019,06:48:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +194,23/11/2019,06:48:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +195,23/11/2019,06:48:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +196,23/11/2019,06:48:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +197,23/11/2019,06:49:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +198,23/11/2019,06:49:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +199,23/11/2019,06:49:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +200,23/11/2019,06:49:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +201,23/11/2019,06:50:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +202,23/11/2019,06:50:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +203,23/11/2019,06:50:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +204,23/11/2019,06:50:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +205,23/11/2019,06:51:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +206,23/11/2019,06:51:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +207,23/11/2019,06:51:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +208,23/11/2019,06:51:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +209,23/11/2019,06:52:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +210,23/11/2019,06:52:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +211,23/11/2019,06:52:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +212,23/11/2019,06:52:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +213,23/11/2019,06:53:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +214,23/11/2019,06:53:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +215,23/11/2019,06:53:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +216,23/11/2019,06:53:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +217,23/11/2019,06:54:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +218,23/11/2019,06:54:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +219,23/11/2019,06:54:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +220,23/11/2019,06:54:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +221,23/11/2019,06:55:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +222,23/11/2019,06:55:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +223,23/11/2019,06:55:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +224,23/11/2019,06:55:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +225,23/11/2019,06:56:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +226,23/11/2019,06:56:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +227,23/11/2019,06:56:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +228,23/11/2019,06:56:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +229,23/11/2019,06:57:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +230,23/11/2019,06:57:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +231,23/11/2019,06:57:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +232,23/11/2019,06:57:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +233,23/11/2019,06:58:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +234,23/11/2019,06:58:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +235,23/11/2019,06:58:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +236,23/11/2019,06:58:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +237,23/11/2019,06:59:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +238,23/11/2019,06:59:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +239,23/11/2019,06:59:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +240,23/11/2019,06:59:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +241,23/11/2019,07:00:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +242,23/11/2019,07:00:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +243,23/11/2019,07:00:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +244,23/11/2019,07:00:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +245,23/11/2019,07:01:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +246,23/11/2019,07:01:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +247,23/11/2019,07:01:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +248,23/11/2019,07:01:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +249,23/11/2019,07:02:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +250,23/11/2019,07:02:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +251,23/11/2019,07:02:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +252,23/11/2019,07:02:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +253,23/11/2019,07:03:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +254,23/11/2019,07:03:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +255,23/11/2019,07:03:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +256,23/11/2019,07:03:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +257,23/11/2019,07:04:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +258,23/11/2019,07:04:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +259,23/11/2019,07:04:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +260,23/11/2019,07:04:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +261,23/11/2019,07:05:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +262,23/11/2019,07:05:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +263,23/11/2019,07:05:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +264,23/11/2019,07:05:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +265,23/11/2019,07:06:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +266,23/11/2019,07:06:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +267,23/11/2019,07:06:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +268,23/11/2019,07:06:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +269,23/11/2019,07:07:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +270,23/11/2019,07:07:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +271,23/11/2019,07:07:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +272,23/11/2019,07:07:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +273,23/11/2019,07:08:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +274,23/11/2019,07:08:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +275,23/11/2019,07:08:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +276,23/11/2019,07:08:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +277,23/11/2019,07:09:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +278,23/11/2019,07:09:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +279,23/11/2019,07:09:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +280,23/11/2019,07:09:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +281,23/11/2019,07:10:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +282,23/11/2019,07:10:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +283,23/11/2019,07:10:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +284,23/11/2019,07:10:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +285,23/11/2019,07:11:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +286,23/11/2019,07:11:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +287,23/11/2019,07:11:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +288,23/11/2019,07:11:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +289,23/11/2019,07:12:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +290,23/11/2019,07:12:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +291,23/11/2019,07:12:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +292,23/11/2019,07:12:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +293,23/11/2019,07:13:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +294,23/11/2019,07:13:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +295,23/11/2019,07:13:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +296,23/11/2019,07:13:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +297,23/11/2019,07:14:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +298,23/11/2019,07:14:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +299,23/11/2019,07:14:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +300,23/11/2019,07:14:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +301,23/11/2019,07:15:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +302,23/11/2019,07:15:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +303,23/11/2019,07:15:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +304,23/11/2019,07:15:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +305,23/11/2019,07:16:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +306,23/11/2019,07:16:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +307,23/11/2019,07:16:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +308,23/11/2019,07:16:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +309,23/11/2019,07:17:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +310,23/11/2019,07:17:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +311,23/11/2019,07:17:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +312,23/11/2019,07:17:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +313,23/11/2019,07:18:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +314,23/11/2019,07:18:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +315,23/11/2019,07:18:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +316,23/11/2019,07:18:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +317,23/11/2019,07:19:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +318,23/11/2019,07:19:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +319,23/11/2019,07:19:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +320,23/11/2019,07:19:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +321,23/11/2019,07:20:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +322,23/11/2019,07:20:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +323,23/11/2019,07:20:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +324,23/11/2019,07:20:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +325,23/11/2019,07:21:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +326,23/11/2019,07:21:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +327,23/11/2019,07:21:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +328,23/11/2019,07:21:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +329,23/11/2019,07:22:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +330,23/11/2019,07:22:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +331,23/11/2019,07:22:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +332,23/11/2019,07:22:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +333,23/11/2019,07:23:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +334,23/11/2019,07:23:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +335,23/11/2019,07:23:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +336,23/11/2019,07:23:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +337,23/11/2019,07:24:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +338,23/11/2019,07:24:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +339,23/11/2019,07:24:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +340,23/11/2019,07:24:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +341,23/11/2019,07:25:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +342,23/11/2019,07:25:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +343,23/11/2019,07:25:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +344,23/11/2019,07:25:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +345,23/11/2019,07:26:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +346,23/11/2019,07:26:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +347,23/11/2019,07:26:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +348,23/11/2019,07:26:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +349,23/11/2019,07:27:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +350,23/11/2019,07:27:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +351,23/11/2019,07:27:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +352,23/11/2019,07:27:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +353,23/11/2019,07:28:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +354,23/11/2019,07:28:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +355,23/11/2019,07:28:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +356,23/11/2019,07:28:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +357,23/11/2019,07:29:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +358,23/11/2019,07:29:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +359,23/11/2019,07:29:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +360,23/11/2019,07:29:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +361,23/11/2019,07:30:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +362,23/11/2019,07:30:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +363,23/11/2019,07:30:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +364,23/11/2019,07:30:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +365,23/11/2019,07:31:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +366,23/11/2019,07:31:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +367,23/11/2019,07:31:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +368,23/11/2019,07:31:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +369,23/11/2019,07:32:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +370,23/11/2019,07:32:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +371,23/11/2019,07:32:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +372,23/11/2019,07:32:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +373,23/11/2019,07:33:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +374,23/11/2019,07:33:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +375,23/11/2019,07:33:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +376,23/11/2019,07:33:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +377,23/11/2019,07:34:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +378,23/11/2019,07:34:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +379,23/11/2019,07:34:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +380,23/11/2019,07:34:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +381,23/11/2019,07:35:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +382,23/11/2019,07:35:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +383,23/11/2019,07:35:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +384,23/11/2019,07:35:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +385,23/11/2019,07:36:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +386,23/11/2019,07:36:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +387,23/11/2019,07:36:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +388,23/11/2019,07:36:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +389,23/11/2019,07:37:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +390,23/11/2019,07:37:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +391,23/11/2019,07:37:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +392,23/11/2019,07:37:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +393,23/11/2019,07:38:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +394,23/11/2019,07:38:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +395,23/11/2019,07:38:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +396,23/11/2019,07:38:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +397,23/11/2019,07:39:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +398,23/11/2019,07:39:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +399,23/11/2019,07:39:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +400,23/11/2019,07:39:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +401,23/11/2019,07:40:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +402,23/11/2019,07:40:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +403,23/11/2019,07:40:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +404,23/11/2019,07:40:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +405,23/11/2019,07:41:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +406,23/11/2019,07:41:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +407,23/11/2019,07:41:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +408,23/11/2019,07:41:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +409,23/11/2019,07:42:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +410,23/11/2019,07:42:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +411,23/11/2019,07:42:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +412,23/11/2019,07:42:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +413,23/11/2019,07:43:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +414,23/11/2019,07:43:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +415,23/11/2019,07:43:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +416,23/11/2019,07:43:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +417,23/11/2019,07:44:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +418,23/11/2019,07:44:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +419,23/11/2019,07:44:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +420,23/11/2019,07:44:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +421,23/11/2019,07:45:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +422,23/11/2019,07:45:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +423,23/11/2019,07:45:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +424,23/11/2019,07:45:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +425,23/11/2019,07:46:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +426,23/11/2019,07:46:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +427,23/11/2019,07:46:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +428,23/11/2019,07:46:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +429,23/11/2019,07:47:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +430,23/11/2019,07:47:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +431,23/11/2019,07:47:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +432,23/11/2019,07:47:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +433,23/11/2019,07:48:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +434,23/11/2019,07:48:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +435,23/11/2019,07:48:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +436,23/11/2019,07:48:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +437,23/11/2019,07:49:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +438,23/11/2019,07:49:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +439,23/11/2019,07:49:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +440,23/11/2019,07:49:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +441,23/11/2019,07:50:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +442,23/11/2019,07:50:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +443,23/11/2019,07:50:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +444,23/11/2019,07:50:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +445,23/11/2019,07:51:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +446,23/11/2019,07:51:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +447,23/11/2019,07:51:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +448,23/11/2019,07:51:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +449,23/11/2019,07:52:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +450,23/11/2019,07:52:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +451,23/11/2019,07:52:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +452,23/11/2019,07:52:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +453,23/11/2019,07:53:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +454,23/11/2019,07:53:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +455,23/11/2019,07:53:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +456,23/11/2019,07:53:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +457,23/11/2019,07:54:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +458,23/11/2019,07:54:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +459,23/11/2019,07:54:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +460,23/11/2019,07:54:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +461,23/11/2019,07:55:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +462,23/11/2019,07:55:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +463,23/11/2019,07:55:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +464,23/11/2019,07:55:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +465,23/11/2019,07:56:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +466,23/11/2019,07:56:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +467,23/11/2019,07:56:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +468,23/11/2019,07:56:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +469,23/11/2019,07:57:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +470,23/11/2019,07:57:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +471,23/11/2019,07:57:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +472,23/11/2019,07:57:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +473,23/11/2019,07:58:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +474,23/11/2019,07:58:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +475,23/11/2019,07:58:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +476,23/11/2019,07:58:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +477,23/11/2019,07:59:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +478,23/11/2019,07:59:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +479,23/11/2019,07:59:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +480,23/11/2019,07:59:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +481,23/11/2019,08:00:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +482,23/11/2019,08:00:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +483,23/11/2019,08:00:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +484,23/11/2019,08:00:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +485,23/11/2019,08:01:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +486,23/11/2019,08:01:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +487,23/11/2019,08:01:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +488,23/11/2019,08:01:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +489,23/11/2019,08:02:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +490,23/11/2019,08:02:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +491,23/11/2019,08:02:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +492,23/11/2019,08:02:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +493,23/11/2019,08:03:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +494,23/11/2019,08:03:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +495,23/11/2019,08:03:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +496,23/11/2019,08:03:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +497,23/11/2019,08:04:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +498,23/11/2019,08:04:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +499,23/11/2019,08:04:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +500,23/11/2019,08:04:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +501,23/11/2019,08:05:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +502,23/11/2019,08:05:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +503,23/11/2019,08:05:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +504,23/11/2019,08:05:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +505,23/11/2019,08:06:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +506,23/11/2019,08:06:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +507,23/11/2019,08:06:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +508,23/11/2019,08:06:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +509,23/11/2019,08:07:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +510,23/11/2019,08:07:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +511,23/11/2019,08:07:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +512,23/11/2019,08:07:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +513,23/11/2019,08:08:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +514,23/11/2019,08:08:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +515,23/11/2019,08:08:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +516,23/11/2019,08:08:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +517,23/11/2019,08:09:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +518,23/11/2019,08:09:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +519,23/11/2019,08:09:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +520,23/11/2019,08:09:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +521,23/11/2019,08:10:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +522,23/11/2019,08:10:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +523,23/11/2019,08:10:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +524,23/11/2019,08:10:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +525,23/11/2019,08:11:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +526,23/11/2019,08:11:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +527,23/11/2019,08:11:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +528,23/11/2019,08:11:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +529,23/11/2019,08:12:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +530,23/11/2019,08:12:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +531,23/11/2019,08:12:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +532,23/11/2019,08:12:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +533,23/11/2019,08:13:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +534,23/11/2019,08:13:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +535,23/11/2019,08:13:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +536,23/11/2019,08:13:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +537,23/11/2019,08:14:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +538,23/11/2019,08:14:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +539,23/11/2019,08:14:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +540,23/11/2019,08:14:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +541,23/11/2019,08:15:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +542,23/11/2019,08:15:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +543,23/11/2019,08:15:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +544,23/11/2019,08:15:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +545,23/11/2019,08:16:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +546,23/11/2019,08:16:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +547,23/11/2019,08:16:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +548,23/11/2019,08:16:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +549,23/11/2019,08:17:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +550,23/11/2019,08:17:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +551,23/11/2019,08:17:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +552,23/11/2019,08:17:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +553,23/11/2019,08:18:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +554,23/11/2019,08:18:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +555,23/11/2019,08:18:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +556,23/11/2019,08:18:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +557,23/11/2019,08:19:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +558,23/11/2019,08:19:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +559,23/11/2019,08:19:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +560,23/11/2019,08:19:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +561,23/11/2019,08:20:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +562,23/11/2019,08:20:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +563,23/11/2019,08:20:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +564,23/11/2019,08:20:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +565,23/11/2019,08:21:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +566,23/11/2019,08:21:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +567,23/11/2019,08:21:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +568,23/11/2019,08:21:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +569,23/11/2019,08:22:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +570,23/11/2019,08:22:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +571,23/11/2019,08:22:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +572,23/11/2019,08:22:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +573,23/11/2019,08:23:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +574,23/11/2019,08:23:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +575,23/11/2019,08:23:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +576,23/11/2019,08:23:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +577,23/11/2019,08:24:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +578,23/11/2019,08:24:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +579,23/11/2019,08:24:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +580,23/11/2019,08:24:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +581,23/11/2019,08:25:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +582,23/11/2019,08:25:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +583,23/11/2019,08:25:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +584,23/11/2019,08:25:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +585,23/11/2019,08:26:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +586,23/11/2019,08:26:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +587,23/11/2019,08:26:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +588,23/11/2019,08:26:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +589,23/11/2019,08:27:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +590,23/11/2019,08:27:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +591,23/11/2019,08:27:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +592,23/11/2019,08:27:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +593,23/11/2019,08:28:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +594,23/11/2019,08:28:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +595,23/11/2019,08:28:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +596,23/11/2019,08:28:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +597,23/11/2019,08:29:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +598,23/11/2019,08:29:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +599,23/11/2019,08:29:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +600,23/11/2019,08:29:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +601,23/11/2019,08:30:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +602,23/11/2019,08:30:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +603,23/11/2019,08:30:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +604,23/11/2019,08:30:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +605,23/11/2019,08:31:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +606,23/11/2019,08:31:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +607,23/11/2019,08:31:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +608,23/11/2019,08:31:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +609,23/11/2019,08:32:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +610,23/11/2019,08:32:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +611,23/11/2019,08:32:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +612,23/11/2019,08:32:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +613,23/11/2019,08:33:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +614,23/11/2019,08:33:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +615,23/11/2019,08:33:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +616,23/11/2019,08:33:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +617,23/11/2019,08:34:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +618,23/11/2019,08:34:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +619,23/11/2019,08:34:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +620,23/11/2019,08:34:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +621,23/11/2019,08:35:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +622,23/11/2019,08:35:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +623,23/11/2019,08:35:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +624,23/11/2019,08:35:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +625,23/11/2019,08:36:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +626,23/11/2019,08:36:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +627,23/11/2019,08:36:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +628,23/11/2019,08:36:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +629,23/11/2019,08:37:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +630,23/11/2019,08:37:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +631,23/11/2019,08:37:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +632,23/11/2019,08:37:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +633,23/11/2019,08:38:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +634,23/11/2019,08:38:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +635,23/11/2019,08:38:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +636,23/11/2019,08:38:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +637,23/11/2019,08:39:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +638,23/11/2019,08:39:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +639,23/11/2019,08:39:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +640,23/11/2019,08:39:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +641,23/11/2019,08:40:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +642,23/11/2019,08:40:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +643,23/11/2019,08:40:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +644,23/11/2019,08:40:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +645,23/11/2019,08:41:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +646,23/11/2019,08:41:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +647,23/11/2019,08:41:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +648,23/11/2019,08:41:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +649,23/11/2019,08:42:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +650,23/11/2019,08:42:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +651,23/11/2019,08:42:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +652,23/11/2019,08:42:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +653,23/11/2019,08:43:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +654,23/11/2019,08:43:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +655,23/11/2019,08:43:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +656,23/11/2019,08:43:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +657,23/11/2019,08:44:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +658,23/11/2019,08:44:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +659,23/11/2019,08:44:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +660,23/11/2019,08:44:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +661,23/11/2019,08:45:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +662,23/11/2019,08:45:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +663,23/11/2019,08:45:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +664,23/11/2019,08:45:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +665,23/11/2019,08:46:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +666,23/11/2019,08:46:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +667,23/11/2019,08:46:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +668,23/11/2019,08:46:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +669,23/11/2019,08:47:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +670,23/11/2019,08:47:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +671,23/11/2019,08:47:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +672,23/11/2019,08:47:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +673,23/11/2019,08:48:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +674,23/11/2019,08:48:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +675,23/11/2019,08:48:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +676,23/11/2019,08:48:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +677,23/11/2019,08:49:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +678,23/11/2019,08:49:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +679,23/11/2019,08:49:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +680,23/11/2019,08:49:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +681,23/11/2019,08:50:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +682,23/11/2019,08:50:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +683,23/11/2019,08:50:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +684,23/11/2019,08:50:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +685,23/11/2019,08:51:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +686,23/11/2019,08:51:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +687,23/11/2019,08:51:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +688,23/11/2019,08:51:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +689,23/11/2019,08:52:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +690,23/11/2019,08:52:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +691,23/11/2019,08:52:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +692,23/11/2019,08:52:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +693,23/11/2019,08:53:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +694,23/11/2019,08:53:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +695,23/11/2019,08:53:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +696,23/11/2019,08:53:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +697,23/11/2019,08:54:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +698,23/11/2019,08:54:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +699,23/11/2019,08:54:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +700,23/11/2019,08:54:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +701,23/11/2019,08:55:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +702,23/11/2019,08:55:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +703,23/11/2019,08:55:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +704,23/11/2019,08:55:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +705,23/11/2019,08:56:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +706,23/11/2019,08:56:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +707,23/11/2019,08:56:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +708,23/11/2019,08:56:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +709,23/11/2019,08:57:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +710,23/11/2019,08:57:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +711,23/11/2019,08:57:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +712,23/11/2019,08:57:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +713,23/11/2019,08:58:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +714,23/11/2019,08:58:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +715,23/11/2019,08:58:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +716,23/11/2019,08:58:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +717,23/11/2019,08:59:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +718,23/11/2019,08:59:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +719,23/11/2019,08:59:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +720,23/11/2019,08:59:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +721,23/11/2019,09:00:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +722,23/11/2019,09:00:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +723,23/11/2019,09:00:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +724,23/11/2019,09:00:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +725,23/11/2019,09:01:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +726,23/11/2019,09:01:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +727,23/11/2019,09:01:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +728,23/11/2019,09:01:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +729,23/11/2019,09:02:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +730,23/11/2019,09:02:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +731,23/11/2019,09:02:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +732,23/11/2019,09:02:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +733,23/11/2019,09:03:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +734,23/11/2019,09:03:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +735,23/11/2019,09:03:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +736,23/11/2019,09:03:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +737,23/11/2019,09:04:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +738,23/11/2019,09:04:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +739,23/11/2019,09:04:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +740,23/11/2019,09:04:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +741,23/11/2019,09:05:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +742,23/11/2019,09:05:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +743,23/11/2019,09:05:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +744,23/11/2019,09:05:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +745,23/11/2019,09:06:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +746,23/11/2019,09:06:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +747,23/11/2019,09:06:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +748,23/11/2019,09:06:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +749,23/11/2019,09:07:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +750,23/11/2019,09:07:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +751,23/11/2019,09:07:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +752,23/11/2019,09:07:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +753,23/11/2019,09:08:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +754,23/11/2019,09:08:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +755,23/11/2019,09:08:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +756,23/11/2019,09:08:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +757,23/11/2019,09:09:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +758,23/11/2019,09:09:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +759,23/11/2019,09:09:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +760,23/11/2019,09:09:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +761,23/11/2019,09:10:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +762,23/11/2019,09:10:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +763,23/11/2019,09:10:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +764,23/11/2019,09:10:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +765,23/11/2019,09:11:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +766,23/11/2019,09:11:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +767,23/11/2019,09:11:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +768,23/11/2019,09:11:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +769,23/11/2019,09:12:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +770,23/11/2019,09:12:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +771,23/11/2019,09:12:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +772,23/11/2019,09:12:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +773,23/11/2019,09:13:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +774,23/11/2019,09:13:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +775,23/11/2019,09:13:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +776,23/11/2019,09:13:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +777,23/11/2019,09:14:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +778,23/11/2019,09:14:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +779,23/11/2019,09:14:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +780,23/11/2019,09:14:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +781,23/11/2019,09:15:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +782,23/11/2019,09:15:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +783,23/11/2019,09:15:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +784,23/11/2019,09:15:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +785,23/11/2019,09:16:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +786,23/11/2019,09:16:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +787,23/11/2019,09:16:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +788,23/11/2019,09:16:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +789,23/11/2019,09:17:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +790,23/11/2019,09:17:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +791,23/11/2019,09:17:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +792,23/11/2019,09:17:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +793,23/11/2019,09:18:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +794,23/11/2019,09:18:15,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +795,23/11/2019,09:18:30,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +796,23/11/2019,09:18:45,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +797,23/11/2019,09:19:00,1,NaN,NaN,NaN,UITGEZONDERD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +798,23/11/2019,09:19:15,0,20,0,NaN,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +799,23/11/2019,09:19:30,0,105,0,NaN,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +800,23/11/2019,09:19:45,0,94,0,NaN,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +801,23/11/2019,09:20:00,0,88,0,NaN,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +802,23/11/2019,09:20:15,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +803,23/11/2019,09:20:30,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +804,23/11/2019,09:20:45,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +805,23/11/2019,09:21:00,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +806,23/11/2019,09:21:15,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +807,23/11/2019,09:21:30,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +808,23/11/2019,09:21:45,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +809,23/11/2019,09:22:00,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +810,23/11/2019,09:22:15,0,58,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +811,23/11/2019,09:22:30,0,113,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +812,23/11/2019,09:22:45,0,144,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +813,23/11/2019,09:23:00,0,237,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +814,23/11/2019,09:23:15,0,18,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +815,23/11/2019,09:23:30,0,88,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +816,23/11/2019,09:23:45,0,170,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +817,23/11/2019,09:24:00,0,298,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +818,23/11/2019,09:24:15,0,113,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +819,23/11/2019,09:24:30,0,113,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +820,23/11/2019,09:24:45,0,125,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +821,23/11/2019,09:25:00,0,82,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +822,23/11/2019,09:25:15,0,91,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +823,23/11/2019,09:25:30,0,188,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +824,23/11/2019,09:25:45,0,109,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +825,23/11/2019,09:26:00,0,208,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +826,23/11/2019,09:26:15,0,328,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +827,23/11/2019,09:26:30,0,79,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +828,23/11/2019,09:26:45,0,117,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +829,23/11/2019,09:27:00,0,101,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +830,23/11/2019,09:27:15,0,94,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +831,23/11/2019,09:27:30,0,194,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +832,23/11/2019,09:27:45,0,22,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +833,23/11/2019,09:28:00,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +834,23/11/2019,09:28:15,0,3,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +835,23/11/2019,09:28:30,0,13,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +836,23/11/2019,09:28:45,0,11,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +837,23/11/2019,09:29:00,0,36,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +838,23/11/2019,09:29:15,0,0,0,0,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +839,23/11/2019,09:29:30,0,0,0,0,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +840,23/11/2019,09:29:45,0,30,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +841,23/11/2019,09:30:00,0,0,0,0,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +842,23/11/2019,09:30:15,0,21,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +843,23/11/2019,09:30:30,0,26,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +844,23/11/2019,09:30:45,0,48,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +845,23/11/2019,09:31:00,0,0,0,0,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +846,23/11/2019,09:31:15,0,40,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +847,23/11/2019,09:31:30,0,4,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +848,23/11/2019,09:31:45,0,16,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +849,23/11/2019,09:32:00,0,0,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +850,23/11/2019,09:32:15,0,29,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +851,23/11/2019,09:32:30,0,5,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +852,23/11/2019,09:32:45,0,70,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +853,23/11/2019,09:33:00,0,11,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +854,23/11/2019,09:33:15,0,91,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +855,23/11/2019,09:33:30,0,144,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +856,23/11/2019,09:33:45,0,109,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +857,23/11/2019,09:34:00,0,139,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +858,23/11/2019,09:34:15,0,105,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +859,23/11/2019,09:34:30,0,159,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +860,23/11/2019,09:34:45,0,82,0,1,ACTIEF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/man/readActiGraphCount.Rd b/man/readActiGraphCount.Rd index 0addd30..9b8df2e 100644 --- a/man/readActiGraphCount.Rd +++ b/man/readActiGraphCount.Rd @@ -8,7 +8,8 @@ } \usage{ readActiGraphCount(filename = file, desiredEpochSize = NULL, - timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "") + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", + timeformatName = "timeformat") } \arguments{ \item{filename}{ @@ -24,6 +25,10 @@ \item{tz}{ Character, timezone name from the timezone database names. } + \item{timeformatName}{ + Character, name of timeformat variable to print in error message when + timeformat is incorrect, of use to GGIR where argument names can differ. + } } \value{ \item{data}{Matrix with one or multiple columns} diff --git a/man/readActiwatchCount.Rd b/man/readActiwatchCount.Rd new file mode 100644 index 0000000..7419267 --- /dev/null +++ b/man/readActiwatchCount.Rd @@ -0,0 +1,42 @@ +\name{readActiwatchCount} +\alias{readActiwatchCount} +\title{ + Read Actiwatch Count data files (csv) +} +\description{ + Reads Actiwatch Count data file. Currently a variety of csv format are facilitated. +} +\usage{ + readActiwatchCount(filename = file, desiredEpochSize = NULL, + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", + timeformatName = "timeformat") +} +\arguments{ + \item{filename}{ + filename (required) + } + \item{desiredEpochSize}{ + Numeric, desired epoch size in seconds. If set aggregate data by summation to + this epochsize. + } + \item{timeformat}{ + Character, timestemp format. + } + \item{tz}{ + Character, timezone name from the timezone database names. + } + \item{timeformatName}{ + Character, name of timeformat variable to print in error message when + timeformat is incorrect, of use to GGIR where argument names can differ. + } +} +\value{ + \item{data}{Matrix with one or multiple columns} + \item{epochSize}{epoch size in seconds of data} + \item{startTime}{POSIXlt format timestamp on which recording starts } + \item{deviceSerialNumber}{Device serial number if it could be extracted + from the file header} +} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/tests/testthat/test_readActiGraphCount.R b/tests/testthat/test_readActiGraphCount.R index 22ae117..6e9a2db 100644 --- a/tests/testthat/test_readActiGraphCount.R +++ b/tests/testthat/test_readActiGraphCount.R @@ -56,11 +56,16 @@ test_that("ActiGraph13_timestamps_headers.csv is correctly read", { expect_equal(nrow(D$data), 200) expect_equal(ncol(D$data), 4) expect_equal(sum(D$data), 256047) - +}) + +test_that("Actiwatch csv error correctly", { + file = system.file("testfiles/ActiGraph13_timestamps_headers.csv", package = "GGIRread") expect_error(readActiGraphCount(filename = file, - desiredEpochSize = 5, - timeformat = "%m/%d/%Y %H:%M:%S")) + desiredEpochSize = 5, + timeformat = "%m/%d/%Y %H:%M:%S"), + regexp = "Time format*") expect_error(readActiGraphCount(filename = file, - desiredEpochSize = 0.5, - timeformat = "%d-%m-%Y %H:%M:%S")) + desiredEpochSize = 0.5, + timeformat = "%d-%m-%Y %H:%M:%S"), + regexp = "The short*") }) \ No newline at end of file diff --git a/tests/testthat/test_readActiwatchCount.R b/tests/testthat/test_readActiwatchCount.R new file mode 100644 index 0000000..eada9a4 --- /dev/null +++ b/tests/testthat/test_readActiwatchCount.R @@ -0,0 +1,56 @@ +library(GGIRread) +context("read Actiwatch files") +test_that("Actiwatch csv is correctly read", { + file = system.file("testfiles/Actiwatch.csv", package = "GGIRread") + D = readActiwatchCount(filename = file, desiredEpochSize = 15, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") + expect_equal(D$epochSize, 15) + expect_equal(format(D$startTime), "2019-11-23 06:00:00") + expect_equal(nrow(D$data), 860) + expect_equal(ncol(D$data), 1) + expect_equal(sum(D$data, na.rm = TRUE), 4589) + + D = readActiwatchCount(filename = file, desiredEpochSize = 30, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") + expect_equal(D$epochSize, 30) + expect_equal(format(D$startTime), "2019-11-23 06:00:00") + expect_equal(nrow(D$data), 430) + expect_equal(ncol(D$data), 1) + expect_equal(sum(D$data, na.rm = TRUE), 4569) +}) +test_that("Actiwatch awd is correctly read", { + file = system.file("testfiles/Actiwatch.AWD", package = "GGIRread") + D = readActiwatchCount(filename = file, desiredEpochSize = 60, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") + expect_equal(D$epochSize, 60) + expect_equal(format(D$startTime), "2009-10-01 17:00:00") + expect_equal(nrow(D$data), 329) + expect_equal(ncol(D$data), 1) + expect_equal(sum(D$data, na.rm = TRUE), 108864) + + D = readActiwatchCount(filename = file, desiredEpochSize = 300, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") + expect_equal(D$epochSize, 300) + expect_equal(format(D$startTime), "2009-10-01 17:00:00") + expect_equal(nrow(D$data), 65) + expect_equal(ncol(D$data), 1) + expect_equal(sum(D$data, na.rm = TRUE), 108713) +}) + +test_that("Actiwatch awd error correctly", { + file = system.file("testfiles/Actiwatch.AWD", package = "GGIRread") + expect_error(readActiwatchCount(filename = file, + desiredEpochSize = 60, + timeformat = "%d-%m-%Y %H:%M:%S"), + regexp = "Time format*") + + expect_error(readActiwatchCount(filename = file, + desiredEpochSize = 5, + timeformat = "%d-%b-%Y %H:%M:%S"), + regexp = "The short*") + + expect_error(readActiwatchCount(filename = "", + desiredEpochSize = 60, + timeformat = "%d-%b-%Y %H:%M:%S"), + regexp = "Cannot") + +}) + + +"\nThe short epoch size as specified by the user (5 seconds) does NOT match the short epoch size we see in the data (60 seconds). Please correct." \ No newline at end of file From 9e2ea7ce77659e7c57c3252cb257f8e39183be8e Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Thu, 26 Sep 2024 17:08:09 +0200 Subject: [PATCH 03/25] reduce code duplication #68 --- R/readActiGraphCount.R | 14 +++----------- R/readActiwatchCount.R | 9 +-------- R/utils_for_countdata.R | 21 ++++++++++++++++++++- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R index 20060f4..1455c73 100644 --- a/R/readActiGraphCount.R +++ b/R/readActiGraphCount.R @@ -107,7 +107,7 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, keep = c(acccol, vmcol)[!is.na(c(acccol, vmcol))] D = D[, keep, drop = FALSE] if (ncol(D) == 3 & is.na(vmcol)) { - D$vm = sqrt(D[,1]^2 + D[,2]^2 + D[,3]^2) + D$vm = sqrt(D[, 1] ^ 2 + D[, 2] ^ 2 + D[, 3] ^ 2) } # Extract information from header, if present if (headerAvailable == TRUE) { @@ -129,12 +129,7 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, if (colnames == TRUE) { datecol = grep("date", colnames(tmp), ignore.case = TRUE) timecol = grep("time|epoch", colnames(tmp), ignore.case = TRUE) - time = tmp[, timecol] - date = tmp[, datecol] - - starttime = time[1] - starttime = date[1] - timestamp = paste0(date, " ", time) + timestamp = paste0(tmp[, datecol], " ", tmp[1, timecol]) format = timeformat timestamp_POSIX = as.POSIXlt(timestamp, tz = tz, format = format) if (all(is.na(timestamp_POSIX))) { @@ -159,10 +154,7 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, if (!is.null(desiredEpochSize)) { if (desiredEpochSize > epSizeShort) { step = desiredEpochSize %/% epSizeShort - D = rbind(rep(0, ncol(D)), D) - D = apply(D, 2, cumsum) - D = D[seq(1, nrow(D), by = step), , drop = FALSE] - D = apply(D, 2, diff) + D = sumAggregate(D, step) epSizeShort = epSizeShort * step } checkEpochMatch(desiredEpochSize, epSizeShort) diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index 0a351bf..e5e8416 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -111,14 +111,7 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, if (!is.null(desiredEpochSize)) { if (desiredEpochSize > epSizeShort) { step = desiredEpochSize %/% epSizeShort - D = rbind(rep(0, ncol(D)), D) - cumsum2 = function(x) { - x = cumsum(ifelse(is.na(x), 0, x)) + x*0 - return(x) - } - D = apply(D, 2, cumsum2) - D = D[seq(1, nrow(D), by = step), , drop = FALSE] - D = apply(D, 2, diff) + D = sumAggregate(D, step) epSizeShort = epSizeShort * step } checkEpochMatch(desiredEpochSize, epSizeShort) diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R index 34ce7ce..49a778a 100644 --- a/R/utils_for_countdata.R +++ b/R/utils_for_countdata.R @@ -1,6 +1,10 @@ -# Collection of short function used in functions readActigraphCount, readActiwatchCount +# Collection of short function used in functions +# - readActigraphCount +# - readActiwatchCount +#----------------------------------------------------------------------------------------- checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? ", timeformatName = NULL) { + # If timestamp_POSIX is NA gieve error message to inform user that something went wrong. if (is.na(timestamp_POSIX)) { stop(paste0("\nTime format in data ", rawValue, " does not match with time format ", timeformat, @@ -10,6 +14,7 @@ checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? } checkEpochMatch = function(desiredEpochSize, epSizeShort) { + # Check whether desired and derived epoch size match if (!is.null(desiredEpochSize) && epSizeShort != desiredEpochSize) { stop(paste0("\nThe short epoch size as specified by the user (", desiredEpochSize, " seconds) does NOT match the short", @@ -39,7 +44,21 @@ detectQuote = function(fn, index) { } getExtension <- function(filename){ + # Extract file extension ex <- unlist(strsplit(basename(filename), split = "[.]")) if (length(ex) < 2) stop(paste0("Cannot recognise extension from '", filename, "' as filename, please check"), call. = FALSE) return(ex[-1]) +} + +sumAggregate = function(mat, step) { + # Aggregate matrix mat by taking the sum over step number of rows + mat = rbind(rep(0, ncol(mat)), mat) + cumsum2 = function(x) { + x = cumsum(ifelse(is.na(x), 0, x)) + x*0 + return(x) + } + mat = apply(mat, 2, cumsum2) + mat = mat[seq(1, nrow(mat), by = step), , drop = FALSE] + mat = apply(mat, 2, diff) + return(mat) } \ No newline at end of file From 859ac7de5c0a015bbaa107144a3895286efa4996 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Thu, 26 Sep 2024 17:40:59 +0200 Subject: [PATCH 04/25] check plausible year for timestamp #68 --- R/utils_for_countdata.R | 12 ++++++++++++ tests/testthat/test_readActiwatchCount.R | 9 ++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R index 49a778a..3491cea 100644 --- a/R/utils_for_countdata.R +++ b/R/utils_for_countdata.R @@ -10,6 +10,18 @@ checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? " does not match with time format ", timeformat, " as specified by argument ", timeformatName, ", please correct.\n"), call. = FALSE) + } else { + year = as.numeric(format(timestamp_POSIX, format = "%Y")) + if (year < 1980 || year > 2500) { + # Assumption that after 2500 no new ActiGraph data will be collected! + stop(paste0("\nTimestamp recognised as ", format(timestamp_POSIX), + " with year identified as ", year, + ". This does not seem to be correct. Raw timestamp value is stored as ", + rawValue, ". please change specification of ", + "argument ", timeformatName, " (currently ", + timeformat, ") to ensure correct interpretation of timestamp.\n"), + call. = FALSE) + } } } diff --git a/tests/testthat/test_readActiwatchCount.R b/tests/testthat/test_readActiwatchCount.R index eada9a4..e36dda0 100644 --- a/tests/testthat/test_readActiwatchCount.R +++ b/tests/testthat/test_readActiwatchCount.R @@ -52,5 +52,12 @@ test_that("Actiwatch awd error correctly", { }) +test_that("checkTimeFormat also detect implausible year", { + rawValue = "6/28/21 10:10:10" + timeformat = "%m/%d/%y %H:%M:%S" + timestamp_POSIX = as.POSIXlt("6/28/21 10:10:10", format = "%m/%d/%Y %H:%M:%S") + expect_error(checkTimeFormat(timestamp_POSIX, rawValue = rawValue, timeformat = timeformat, + timeformatName = NULL), + regexpr = "Timestamp recognised as 0021*") -"\nThe short epoch size as specified by the user (5 seconds) does NOT match the short epoch size we see in the data (60 seconds). Please correct." \ No newline at end of file +}) \ No newline at end of file From c32837b54187fac2beda846d0b54add4fb12a728 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 08:52:53 +0200 Subject: [PATCH 05/25] add functionality for Actical csv format #68 --- NAMESPACE | 3 +- NEWS.md | 2 +- R/readActicalCount.R | 90 +++++ README.md | 13 +- inst/testfiles/Actical.csv | 532 +++++++++++++++++++++++++ man/readActicalCount.Rd | 40 ++ man/readActiwatchCount.Rd | 2 - tests/testthat/test_readActicalCount.R | 31 ++ 8 files changed, 704 insertions(+), 9 deletions(-) create mode 100644 R/readActicalCount.R create mode 100644 inst/testfiles/Actical.csv create mode 100644 man/readActicalCount.Rd create mode 100644 tests/testthat/test_readActicalCount.R diff --git a/NAMESPACE b/NAMESPACE index 0a310ba..bbd7ca6 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,7 @@ export(readGenea, readAxivity, readGENEActiv, GENEActivReader, resample, readWav, - readActiGraphCount, readActiwatchCount) + readActiGraphCount, readActiwatchCount, + readActicalCount) useDynLib(GGIRread, .registration = TRUE) importFrom(Rcpp, sourceCpp) importFrom(data.table, fread) diff --git a/NEWS.md b/NEWS.md index 891fe2d..4564353 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,7 +3,7 @@ - Added a `NEWS.md` file to track changes to the package. - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. - Migrate read function for ActiGraph (csv) and Actiwatch (csv/awd) count data to GGIRread #68. - +- Add read function for Actical (csv) count data #68. # Changes in version 1.0.1 (release date:03-06-2024) diff --git a/R/readActicalCount.R b/R/readActicalCount.R new file mode 100644 index 0000000..011d13d --- /dev/null +++ b/R/readActicalCount.R @@ -0,0 +1,90 @@ +readActicalCount = function(filename = file, desiredEpochSize = NULL, + timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { + # In GGIR set timeformatName to extEpochData_timeformat + + + # ! Assumptions that timeseries start before line 1000 + index = 300 + while (index > 0) { + quote = detectQuote(fn = filename, index = index) + testraw = data.table::fread(input = filename, + header = FALSE, sep = ",", skip = index, + nrows = 2, data.table = FALSE, quote = quote) + if (length(testraw) > 0) { + if (nrow(testraw) == 2) { + if (testraw$V1[2] == testraw$V1[1] + 1) { + break + } + } + } + index = index - 100 + } + # ! Assumption that first column are the epoch numbers + delta = 1 - testraw$V1[1] + index = index + delta + startFound = FALSE + while (startFound == FALSE) { + Dtest = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, nrows = 1) + if (Dtest$V1[1] == 1) { + startFound = TRUE + } else { + # This happens when file is has an empty row between each measurement point is stored + index = index - 1 + if (index < 1) stop("Could not find start of recording", call. = FALSE) + } + } + D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, data.table = FALSE) + # ! Assumption that column names are present 2 lines prior to timeseries + dashedlineFound = FALSE + dashedLineIndex = index + while (dashedlineFound == FALSE) { + linedata = data.table::fread(input = filename, data.table = FALSE, + header = FALSE, sep = ",", + skip = dashedLineIndex, nrows = 1, quote = quote) + if (length(grep(pattern = "------", x = linedata[1])) == 1) { + dashedlineFound = TRUE + } else { + dashedLineIndex = dashedLineIndex - 1 + } + } + colnames = data.table::fread(input = filename, data.table = FALSE, + header = FALSE, sep = ",", + skip = dashedLineIndex + 1, nrows = (index - dashedLineIndex) - 2, quote = quote) + + collapse = function(x) { + return(paste0(x, collapse = "_")) + } + colnames = tolower(as.character(apply(colnames, MARGIN = 2, FUN = collapse))) + colnames(D) = colnames + # ! Assumptions about columns names + colnames(D)[grep(pattern = "time", x = colnames(D))] = "time" + colnames(D)[grep(pattern = "date", x = colnames(D))] = "date" + colnames(D)[grep(pattern = "activity_counts", x = colnames(D))] = "counts" + colnames(D)[grep(pattern = "steps", x = colnames(D))] = "steps" + D = D[, grep(pattern = "time|date|counts|steps", x = colnames(D))] + timestamp_POSIX = as.POSIXct(x = paste(D$date[1:4], D$time[1:4], sep = " "), + format = timeformat, + tz = tz) + checkTimeFormat(timestamp_POSIX[1], + rawValue = paste(D$date[1], D$time[1], sep = " "), + timeformat = timeformat, + timeformatName = timeformatName) + epSizeShort = mean(diff(as.numeric(timestamp_POSIX))) + timestamp_POSIX = timestamp_POSIX[1] + D = D[, -which(colnames(D) %in% c("date", "time"))] + D = as.matrix(D, drop = FALSE) + + # If requested, aggregate data to lower resolution to match desired + # epoch size in argument windowsizes + if (!is.null(desiredEpochSize)) { + if (desiredEpochSize > epSizeShort) { + step = desiredEpochSize %/% epSizeShort + D = sumAggregate(D, step) + epSizeShort = epSizeShort * step + } + checkEpochMatch(desiredEpochSize, epSizeShort) + } + if (quote == "") D = apply(D, 2, as.numeric) + invisible(list(data = D, epochSize = epSizeShort, + startTime = timestamp_POSIX)) +} \ No newline at end of file diff --git a/README.md b/README.md index 1e5944e..915fd8c 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,11 @@ Functions for reading accelerometer data from the following file formats: -Brand | Device name | File extension | GGIRread function ------- | ------- | ------- | ---------------- -Axivity Ltd https://axivity.com/ | AX3 and AX6 | .cwa | readAxivity -ActivInsights Ltd https://activinsights.com/ | GENEActiv Original and Sleep | .bin | readGENEActiv -Unilever Discover Ltd | Genea (no longer manufactured) | .bin | readGenea \ No newline at end of file +Brand | Device name | File extension | Data type | GGIRread function +------ | ------- | ------- | ---------------- | --------------------- +Axivity Ltd https://axivity.com/ | AX3 and AX6 | .cwa | raw gravitational units |readAxivity +ActivInsights Ltd https://activinsights.com/ | GENEActiv Original and Sleep | .bin | raw gravitational units | readGENEActiv +Unilever Discover Ltd | Genea (no longer manufactured) | .bin | raw gravitational units | readGenea +ActiGraph | ??? | .csv | count data | readActigraph +Actiwatch | ??? | .csv and .awd | count data | readActiwatch +Actical | ??? | .csv | count data | readActical \ No newline at end of file diff --git a/inst/testfiles/Actical.csv b/inst/testfiles/Actical.csv new file mode 100644 index 0000000..3633ede --- /dev/null +++ b/inst/testfiles/Actical.csv @@ -0,0 +1,532 @@ +Actical List Export File (Version 03.00),,,,,,,,, +Filename:,,,,,,,,, +,,,,,,,,, +--------------- Subject and Device Settings ----------------,,,,,,,,, +Identity:,AM2105031920,,,,,,,, +Age:,,years,,,,,,, +Gender:,Unknown,,,,,,,, +Height:,0,cm,,,,,,, +,0,inches,,,,,,, +Weight:,0,kg,,,,,,, +,0,lbs,,,,,,, +Start Date:,13-May-21,(Thu),,,,,,, +Start Time:,00:00,,,,,,,, +Device Serial Number:,B11FFFF,,,,,,,, +,,,,,,,,, +-------------------- Analysis Settings ---------------------,,,,,,,,, +Light/Moderate Cutpoint:,0,kcals/min/kg,,,,,,, +Moderate/Vigorous Cutpoint:,0,kcals/min/kg,,,,,,, +Energy Expenditure Output Type (unit):,AEE,(Activity Energy Expenditure),,,,,,, +Subject Type (age level):,UNKNOWN,,,,,,,, +Device Location:,WRIST,,,,,,,, +Model Type:,SINGLE REGRESSION,,,,,,,, +Smoothing Filter:,1,minute,,,,,,, +,,,,,,,,, +------------------- Epoch-by-Epoch Data --------------------,,,,,,,,, +Epoch#,Day#,Elapsed,Date,Time,Activity,Steps,Energy,Activity,Event Marker +,,Seconds,,,Counts,,Expenditure,Intensity,Button Presses +,,,,,,,kcals/min/kg,(1=sedentary),(1=pressed) +,,,,,,,,(2=light),(0=not pressed) +,,,,,,,,(3=moderate), +,,,,,,,,(4=vigorous), +0,1,60,13-May-21,00:00,250,12,NaN,NaN,0 +1,1,120,13-May-21,00:01,361,50,NaN,NaN,0 +2,1,180,13-May-21,00:02,567,15,0,1,0 +3,1,240,13-May-21,00:03,151,0,0,1,0 +4,1,300,13-May-21,00:04,0,0,0,1,0 +5,1,360,13-May-21,00:05,0,0,0,1,0 +6,1,420,13-May-21,00:06,0,0,0,1,0 +7,1,480,13-May-21,00:07,0,0,0,1,0 +8,1,540,13-May-21,00:08,0,0,0,1,0 +9,1,600,13-May-21,00:09,250,12,0,1,0 +10,1,660,13-May-21,00:10,361,50,0,1,0 +11,1,720,13-May-21,00:11,567,15,0,1,0 +12,1,780,13-May-21,00:12,151,0,0,1,0 +13,1,840,13-May-21,00:13,0,0,0,1,0 +14,1,900,13-May-21,00:14,0,0,0,1,0 +15,1,960,13-May-21,00:15,0,0,0,1,0 +16,1,1020,13-May-21,00:16,0,0,0,1,0 +17,1,1080,13-May-21,00:17,0,0,0,1,0 +18,1,1140,13-May-21,00:18,250,12,0,1,0 +19,1,1200,13-May-21,00:19,361,50,0,1,0 +20,1,1260,13-May-21,00:20,567,15,0,1,0 +21,1,1320,13-May-21,00:21,151,0,0,1,0 +22,1,1380,13-May-21,00:22,0,0,0,1,0 +23,1,1440,13-May-21,00:23,0,0,0,1,0 +24,1,1500,13-May-21,00:24,0,0,0,1,0 +25,1,1560,13-May-21,00:25,0,0,0,1,0 +26,1,1620,13-May-21,00:26,0,0,0,1,0 +27,1,1680,13-May-21,00:27,250,12,0,1,0 +28,1,1740,13-May-21,00:28,361,50,0,1,0 +29,1,1800,13-May-21,00:29,567,15,0,1,0 +30,1,1860,13-May-21,00:30,151,0,0,1,0 +31,1,1920,13-May-21,00:31,0,0,0,1,0 +32,1,1980,13-May-21,00:32,0,0,0,1,0 +33,1,2040,13-May-21,00:33,0,0,0,1,0 +34,1,2100,13-May-21,00:34,0,0,0,1,0 +35,1,2160,13-May-21,00:35,0,0,0,1,0 +36,1,2220,13-May-21,00:36,250,12,0,1,0 +37,1,2280,13-May-21,00:37,361,50,0,1,0 +38,1,2340,13-May-21,00:38,567,15,0,1,0 +39,1,2400,13-May-21,00:39,151,0,0,1,0 +40,1,2460,13-May-21,00:40,0,0,0,1,0 +41,1,2520,13-May-21,00:41,0,0,0,1,0 +42,1,2580,13-May-21,00:42,0,0,0,1,0 +43,1,2640,13-May-21,00:43,0,0,0,1,0 +44,1,2700,13-May-21,00:44,0,0,0,1,0 +45,1,2760,13-May-21,00:45,250,12,0,1,0 +46,1,2820,13-May-21,00:46,361,50,0,1,0 +47,1,2880,13-May-21,00:47,567,15,0,1,0 +48,1,2940,13-May-21,00:48,151,0,0,1,0 +49,1,3000,13-May-21,00:49,0,0,0,1,0 +50,1,3060,13-May-21,00:50,0,0,0,1,0 +51,1,3120,13-May-21,00:51,0,0,0,1,0 +52,1,3180,13-May-21,00:52,0,0,0,1,0 +53,1,3240,13-May-21,00:53,0,0,0,1,0 +54,1,3300,13-May-21,00:54,0,0,0,1,0 +55,1,3360,13-May-21,00:55,0,0,0,1,0 +56,1,3420,13-May-21,00:56,0,0,0,1,0 +57,1,3480,13-May-21,00:57,0,0,0,1,0 +58,1,3540,13-May-21,00:58,0,0,0,1,0 +59,1,3600,13-May-21,00:59,0,0,0,1,0 +60,1,3660,13-May-21,01:00,0,0,0,1,0 +61,1,3720,13-May-21,01:01,0,0,0,1,0 +62,1,3780,13-May-21,01:02,0,0,0,1,0 +63,1,3840,13-May-21,01:03,0,0,0,1,0 +64,1,3900,13-May-21,01:04,0,0,0,1,0 +65,1,3960,13-May-21,01:05,0,0,0,1,0 +66,1,4020,13-May-21,01:06,0,0,0,1,0 +67,1,4080,13-May-21,01:07,0,0,0,1,0 +68,1,4140,13-May-21,01:08,0,0,0,1,0 +69,1,4200,13-May-21,01:09,0,0,0,1,0 +70,1,4260,13-May-21,01:10,0,0,0,1,0 +71,1,4320,13-May-21,01:11,0,0,0,1,0 +72,1,4380,13-May-21,01:12,0,0,0,1,0 +73,1,4440,13-May-21,01:13,0,0,0,1,0 +74,1,4500,13-May-21,01:14,0,0,0,1,0 +75,1,4560,13-May-21,01:15,0,0,0,1,0 +76,1,4620,13-May-21,01:16,0,0,0,1,0 +77,1,4680,13-May-21,01:17,0,0,0,1,0 +78,1,4740,13-May-21,01:18,0,0,0,1,0 +79,1,4800,13-May-21,01:19,0,0,0,1,0 +80,1,4860,13-May-21,01:20,0,0,0,1,0 +81,1,4920,13-May-21,01:21,0,0,0,1,0 +82,1,4980,13-May-21,01:22,0,0,0,1,0 +83,1,5040,13-May-21,01:23,0,0,0,1,0 +84,1,5100,13-May-21,01:24,0,0,0,1,0 +85,1,5160,13-May-21,01:25,0,0,0,1,0 +86,1,5220,13-May-21,01:26,0,0,0,1,0 +87,1,5280,13-May-21,01:27,0,0,0,1,0 +88,1,5340,13-May-21,01:28,0,0,0,1,0 +89,1,5400,13-May-21,01:29,0,0,0,1,0 +90,1,5460,13-May-21,01:30,0,0,0,1,0 +91,1,5520,13-May-21,01:31,0,0,0,1,0 +92,1,5580,13-May-21,01:32,0,0,0,1,0 +93,1,5640,13-May-21,01:33,0,0,0,1,0 +94,1,5700,13-May-21,01:34,0,0,0,1,0 +95,1,5760,13-May-21,01:35,0,0,0,1,0 +96,1,5820,13-May-21,01:36,0,0,0,1,0 +97,1,5880,13-May-21,01:37,0,0,0,1,0 +98,1,5940,13-May-21,01:38,0,0,0,1,0 +99,1,6000,13-May-21,01:39,0,0,0,1,0 +100,1,6060,13-May-21,01:40,0,0,0,1,0 +101,1,6120,13-May-21,01:41,0,0,0,1,0 +102,1,6180,13-May-21,01:42,0,0,0,1,0 +103,1,6240,13-May-21,01:43,0,0,0,1,0 +104,1,6300,13-May-21,01:44,0,0,0,1,0 +105,1,6360,13-May-21,01:45,0,0,0,1,0 +106,1,6420,13-May-21,01:46,0,0,0,1,0 +107,1,6480,13-May-21,01:47,0,0,0,1,0 +108,1,6540,13-May-21,01:48,0,0,0,1,0 +109,1,6600,13-May-21,01:49,0,0,0,1,0 +110,1,6660,13-May-21,01:50,0,0,0,1,0 +111,1,6720,13-May-21,01:51,0,0,0,1,0 +112,1,6780,13-May-21,01:52,0,0,0,1,0 +113,1,6840,13-May-21,01:53,0,0,0,1,0 +114,1,6900,13-May-21,01:54,0,0,0,1,0 +115,1,6960,13-May-21,01:55,0,0,0,1,0 +116,1,7020,13-May-21,01:56,0,0,0,1,0 +117,1,7080,13-May-21,01:57,0,0,0,1,0 +118,1,7140,13-May-21,01:58,0,0,0,1,0 +119,1,7200,13-May-21,01:59,0,0,0,1,0 +120,1,7260,13-May-21,02:00,0,0,0,1,0 +121,1,7320,13-May-21,02:01,0,0,0,1,0 +122,1,7380,13-May-21,02:02,0,0,0,1,0 +123,1,7440,13-May-21,02:03,0,0,0,1,0 +124,1,7500,13-May-21,02:04,0,0,0,1,0 +125,1,7560,13-May-21,02:05,0,0,0,1,0 +126,1,7620,13-May-21,02:06,0,0,0,1,0 +127,1,7680,13-May-21,02:07,0,0,0,1,0 +128,1,7740,13-May-21,02:08,0,0,0,1,0 +129,1,7800,13-May-21,02:09,0,0,0,1,0 +130,1,7860,13-May-21,02:10,0,0,0,1,0 +131,1,7920,13-May-21,02:11,0,0,0,1,0 +132,1,7980,13-May-21,02:12,0,0,0,1,0 +133,1,8040,13-May-21,02:13,0,0,0,1,0 +134,1,8100,13-May-21,02:14,0,0,0,1,0 +135,1,8160,13-May-21,02:15,0,0,0,1,0 +136,1,8220,13-May-21,02:16,0,0,0,1,0 +137,1,8280,13-May-21,02:17,0,0,0,1,0 +138,1,8340,13-May-21,02:18,0,0,0,1,0 +139,1,8400,13-May-21,02:19,0,0,0,1,0 +140,1,8460,13-May-21,02:20,0,0,0,1,0 +141,1,8520,13-May-21,02:21,0,0,0,1,0 +142,1,8580,13-May-21,02:22,0,0,0,1,0 +143,1,8640,13-May-21,02:23,0,0,0,1,0 +144,1,8700,13-May-21,02:24,0,0,0,1,0 +145,1,8760,13-May-21,02:25,0,0,0,1,0 +146,1,8820,13-May-21,02:26,0,0,0,1,0 +147,1,8880,13-May-21,02:27,0,0,0,1,0 +148,1,8940,13-May-21,02:28,0,0,0,1,0 +149,1,9000,13-May-21,02:29,0,0,0,1,0 +150,1,9060,13-May-21,02:30,0,0,0,1,0 +151,1,9120,13-May-21,02:31,0,0,0,1,0 +152,1,9180,13-May-21,02:32,0,0,0,1,0 +153,1,9240,13-May-21,02:33,0,0,0,1,0 +154,1,9300,13-May-21,02:34,0,0,0,1,0 +155,1,9360,13-May-21,02:35,0,0,0,1,0 +156,1,9420,13-May-21,02:36,0,0,0,1,0 +157,1,9480,13-May-21,02:37,0,0,0,1,0 +158,1,9540,13-May-21,02:38,0,0,0,1,0 +159,1,9600,13-May-21,02:39,0,0,0,1,0 +160,1,9660,13-May-21,02:40,0,0,0,1,0 +161,1,9720,13-May-21,02:41,0,0,0,1,0 +162,1,9780,13-May-21,02:42,0,0,0,1,0 +163,1,9840,13-May-21,02:43,0,0,0,1,0 +164,1,9900,13-May-21,02:44,0,0,0,1,0 +165,1,9960,13-May-21,02:45,0,0,0,1,0 +166,1,10020,13-May-21,02:46,0,0,0,1,0 +167,1,10080,13-May-21,02:47,0,0,0,1,0 +168,1,10140,13-May-21,02:48,0,0,0,1,0 +169,1,10200,13-May-21,02:49,0,0,0,1,0 +170,1,10260,13-May-21,02:50,0,0,0,1,0 +171,1,10320,13-May-21,02:51,0,0,0,1,0 +172,1,10380,13-May-21,02:52,0,0,0,1,0 +173,1,10440,13-May-21,02:53,0,0,0,1,0 +174,1,10500,13-May-21,02:54,0,0,0,1,0 +175,1,10560,13-May-21,02:55,0,0,0,1,0 +176,1,10620,13-May-21,02:56,0,0,0,1,0 +177,1,10680,13-May-21,02:57,0,0,0,1,0 +178,1,10740,13-May-21,02:58,0,0,0,1,0 +179,1,10800,13-May-21,02:59,0,0,0,1,0 +180,1,10860,13-May-21,03:00,0,0,0,1,0 +181,1,10920,13-May-21,03:01,0,0,0,1,0 +182,1,10980,13-May-21,03:02,0,0,0,1,0 +183,1,11040,13-May-21,03:03,0,0,0,1,0 +184,1,11100,13-May-21,03:04,0,0,0,1,0 +185,1,11160,13-May-21,03:05,0,0,0,1,0 +186,1,11220,13-May-21,03:06,0,0,0,1,0 +187,1,11280,13-May-21,03:07,0,0,0,1,0 +188,1,11340,13-May-21,03:08,0,0,0,1,0 +189,1,11400,13-May-21,03:09,0,0,0,1,0 +190,1,11460,13-May-21,03:10,0,0,0,1,0 +191,1,11520,13-May-21,03:11,0,0,0,1,0 +192,1,11580,13-May-21,03:12,0,0,0,1,0 +193,1,11640,13-May-21,03:13,0,0,0,1,0 +194,1,11700,13-May-21,03:14,0,0,0,1,0 +195,1,11760,13-May-21,03:15,0,0,0,1,0 +196,1,11820,13-May-21,03:16,0,0,0,1,0 +197,1,11880,13-May-21,03:17,0,0,0,1,0 +198,1,11940,13-May-21,03:18,0,0,0,1,0 +199,1,12000,13-May-21,03:19,0,0,0,1,0 +200,1,12060,13-May-21,03:20,0,0,0,1,0 +201,1,12120,13-May-21,03:21,0,0,0,1,0 +202,1,12180,13-May-21,03:22,0,0,0,1,0 +203,1,12240,13-May-21,03:23,0,0,0,1,0 +204,1,12300,13-May-21,03:24,0,0,0,1,0 +205,1,12360,13-May-21,03:25,0,0,0,1,0 +206,1,12420,13-May-21,03:26,0,0,0,1,0 +207,1,12480,13-May-21,03:27,0,0,0,1,0 +208,1,12540,13-May-21,03:28,0,0,0,1,0 +209,1,12600,13-May-21,03:29,0,0,0,1,0 +210,1,12660,13-May-21,03:30,0,0,0,1,0 +211,1,12720,13-May-21,03:31,0,0,0,1,0 +212,1,12780,13-May-21,03:32,0,0,0,1,0 +213,1,12840,13-May-21,03:33,0,0,0,1,0 +214,1,12900,13-May-21,03:34,0,0,0,1,0 +215,1,12960,13-May-21,03:35,0,0,0,1,0 +216,1,13020,13-May-21,03:36,0,0,0,1,0 +217,1,13080,13-May-21,03:37,0,0,0,1,0 +218,1,13140,13-May-21,03:38,0,0,0,1,0 +219,1,13200,13-May-21,03:39,0,0,0,1,0 +220,1,13260,13-May-21,03:40,0,0,0,1,0 +221,1,13320,13-May-21,03:41,0,0,0,1,0 +222,1,13380,13-May-21,03:42,0,0,0,1,0 +223,1,13440,13-May-21,03:43,0,0,0,1,0 +224,1,13500,13-May-21,03:44,0,0,0,1,0 +225,1,13560,13-May-21,03:45,0,0,0,1,0 +226,1,13620,13-May-21,03:46,0,0,0,1,0 +227,1,13680,13-May-21,03:47,0,0,0,1,0 +228,1,13740,13-May-21,03:48,0,0,0,1,0 +229,1,13800,13-May-21,03:49,0,0,0,1,0 +230,1,13860,13-May-21,03:50,0,0,0,1,0 +231,1,13920,13-May-21,03:51,0,0,0,1,0 +232,1,13980,13-May-21,03:52,0,0,0,1,0 +233,1,14040,13-May-21,03:53,0,0,0,1,0 +234,1,14100,13-May-21,03:54,0,0,0,1,0 +235,1,14160,13-May-21,03:55,0,0,0,1,0 +236,1,14220,13-May-21,03:56,0,0,0,1,0 +237,1,14280,13-May-21,03:57,0,0,0,1,0 +238,1,14340,13-May-21,03:58,0,0,0,1,0 +239,1,14400,13-May-21,03:59,0,0,0,1,0 +240,1,14460,13-May-21,04:00,0,0,0,1,0 +241,1,14520,13-May-21,04:01,0,0,0,1,0 +242,1,14580,13-May-21,04:02,0,0,0,1,0 +243,1,14640,13-May-21,04:03,0,0,0,1,0 +244,1,14700,13-May-21,04:04,0,0,0,1,0 +245,1,14760,13-May-21,04:05,0,0,0,1,0 +246,1,14820,13-May-21,04:06,0,0,0,1,0 +247,1,14880,13-May-21,04:07,0,0,0,1,0 +248,1,14940,13-May-21,04:08,0,0,0,1,0 +249,1,15000,13-May-21,04:09,0,0,0,1,0 +250,1,15060,13-May-21,04:10,0,0,0,1,0 +251,1,15120,13-May-21,04:11,0,0,0,1,0 +252,1,15180,13-May-21,04:12,0,0,0,1,0 +253,1,15240,13-May-21,04:13,0,0,0,1,0 +254,1,15300,13-May-21,04:14,0,0,0,1,0 +255,1,15360,13-May-21,04:15,0,0,0,1,0 +256,1,15420,13-May-21,04:16,0,0,0,1,0 +257,1,15480,13-May-21,04:17,0,0,0,1,0 +258,1,15540,13-May-21,04:18,0,0,0,1,0 +259,1,15600,13-May-21,04:19,0,0,0,1,0 +260,1,15660,13-May-21,04:20,0,0,0,1,0 +261,1,15720,13-May-21,04:21,0,0,0,1,0 +262,1,15780,13-May-21,04:22,0,0,0,1,0 +263,1,15840,13-May-21,04:23,0,0,0,1,0 +264,1,15900,13-May-21,04:24,0,0,0,1,0 +265,1,15960,13-May-21,04:25,0,0,0,1,0 +266,1,16020,13-May-21,04:26,0,0,0,1,0 +267,1,16080,13-May-21,04:27,0,0,0,1,0 +268,1,16140,13-May-21,04:28,0,0,0,1,0 +269,1,16200,13-May-21,04:29,0,0,0,1,0 +270,1,16260,13-May-21,04:30,0,0,0,1,0 +271,1,16320,13-May-21,04:31,0,0,0,1,0 +272,1,16380,13-May-21,04:32,0,0,0,1,0 +273,1,16440,13-May-21,04:33,0,0,0,1,0 +274,1,16500,13-May-21,04:34,0,0,0,1,0 +275,1,16560,13-May-21,04:35,0,0,0,1,0 +276,1,16620,13-May-21,04:36,0,0,0,1,0 +277,1,16680,13-May-21,04:37,0,0,0,1,0 +278,1,16740,13-May-21,04:38,0,0,0,1,0 +279,1,16800,13-May-21,04:39,0,0,0,1,0 +280,1,16860,13-May-21,04:40,0,0,0,1,0 +281,1,16920,13-May-21,04:41,0,0,0,1,0 +282,1,16980,13-May-21,04:42,0,0,0,1,0 +283,1,17040,13-May-21,04:43,0,0,0,1,0 +284,1,17100,13-May-21,04:44,0,0,0,1,0 +285,1,17160,13-May-21,04:45,0,0,0,1,0 +286,1,17220,13-May-21,04:46,0,0,0,1,0 +287,1,17280,13-May-21,04:47,0,0,0,1,0 +288,1,17340,13-May-21,04:48,0,0,0,1,0 +289,1,17400,13-May-21,04:49,0,0,0,1,0 +290,1,17460,13-May-21,04:50,0,0,0,1,0 +291,1,17520,13-May-21,04:51,0,0,0,1,0 +292,1,17580,13-May-21,04:52,0,0,0,1,0 +293,1,17640,13-May-21,04:53,0,0,0,1,0 +294,1,17700,13-May-21,04:54,0,0,0,1,0 +295,1,17760,13-May-21,04:55,0,0,0,1,0 +296,1,17820,13-May-21,04:56,0,0,0,1,0 +297,1,17880,13-May-21,04:57,0,0,0,1,0 +298,1,17940,13-May-21,04:58,0,0,0,1,0 +299,1,18000,13-May-21,04:59,0,0,0,1,0 +300,1,18060,13-May-21,05:00,0,0,0,1,0 +301,1,18120,13-May-21,05:01,0,0,0,1,0 +302,1,18180,13-May-21,05:02,0,0,0,1,0 +303,1,18240,13-May-21,05:03,0,0,0,1,0 +304,1,18300,13-May-21,05:04,0,0,0,1,0 +305,1,18360,13-May-21,05:05,0,0,0,1,0 +306,1,18420,13-May-21,05:06,0,0,0,1,0 +307,1,18480,13-May-21,05:07,0,0,0,1,0 +308,1,18540,13-May-21,05:08,0,0,0,1,0 +309,1,18600,13-May-21,05:09,0,0,0,1,0 +310,1,18660,13-May-21,05:10,0,0,0,1,0 +311,1,18720,13-May-21,05:11,0,0,0,1,0 +312,1,18780,13-May-21,05:12,0,0,0,1,0 +313,1,18840,13-May-21,05:13,0,0,0,1,0 +314,1,18900,13-May-21,05:14,0,0,0,1,0 +315,1,18960,13-May-21,05:15,0,0,0,1,0 +316,1,19020,13-May-21,05:16,0,0,0,1,0 +317,1,19080,13-May-21,05:17,0,0,0,1,0 +318,1,19140,13-May-21,05:18,0,0,0,1,0 +319,1,19200,13-May-21,05:19,0,0,0,1,0 +320,1,19260,13-May-21,05:20,0,0,0,1,0 +321,1,19320,13-May-21,05:21,0,0,0,1,0 +322,1,19380,13-May-21,05:22,0,0,0,1,0 +323,1,19440,13-May-21,05:23,0,0,0,1,0 +324,1,19500,13-May-21,05:24,0,0,0,1,0 +325,1,19560,13-May-21,05:25,0,0,0,1,0 +326,1,19620,13-May-21,05:26,0,0,0,1,0 +327,1,19680,13-May-21,05:27,0,0,0,1,0 +328,1,19740,13-May-21,05:28,0,0,0,1,0 +329,1,19800,13-May-21,05:29,0,0,0,1,0 +330,1,19860,13-May-21,05:30,0,0,0,1,0 +331,1,19920,13-May-21,05:31,0,0,0,1,0 +332,1,19980,13-May-21,05:32,0,0,0,1,0 +333,1,20040,13-May-21,05:33,0,0,0,1,0 +334,1,20100,13-May-21,05:34,0,0,0,1,0 +335,1,20160,13-May-21,05:35,0,0,0,1,0 +336,1,20220,13-May-21,05:36,0,0,0,1,0 +337,1,20280,13-May-21,05:37,0,0,0,1,0 +338,1,20340,13-May-21,05:38,0,0,0,1,0 +339,1,20400,13-May-21,05:39,0,0,0,1,0 +340,1,20460,13-May-21,05:40,0,0,0,1,0 +341,1,20520,13-May-21,05:41,0,0,0,1,0 +342,1,20580,13-May-21,05:42,0,0,0,1,0 +343,1,20640,13-May-21,05:43,0,0,0,1,0 +344,1,20700,13-May-21,05:44,0,0,0,1,0 +345,1,20760,13-May-21,05:45,0,0,0,1,0 +346,1,20820,13-May-21,05:46,0,0,0,1,0 +347,1,20880,13-May-21,05:47,0,0,0,1,0 +348,1,20940,13-May-21,05:48,0,0,0,1,0 +349,1,21000,13-May-21,05:49,0,0,0,1,0 +350,1,21060,13-May-21,05:50,0,0,0,1,0 +351,1,21120,13-May-21,05:51,0,0,0,1,0 +352,1,21180,13-May-21,05:52,0,0,0,1,0 +353,1,21240,13-May-21,05:53,0,0,0,1,0 +354,1,21300,13-May-21,05:54,0,0,0,1,0 +355,1,21360,13-May-21,05:55,0,0,0,1,0 +356,1,21420,13-May-21,05:56,0,0,0,1,0 +357,1,21480,13-May-21,05:57,0,0,0,1,0 +358,1,21540,13-May-21,05:58,0,0,0,1,0 +359,1,21600,13-May-21,05:59,0,0,0,1,0 +360,1,21660,13-May-21,06:00,0,0,0,1,0 +361,1,21720,13-May-21,06:01,0,0,0,1,0 +362,1,21780,13-May-21,06:02,0,0,0,1,0 +363,1,21840,13-May-21,06:03,0,0,0,1,0 +364,1,21900,13-May-21,06:04,0,0,0,1,0 +365,1,21960,13-May-21,06:05,0,0,0,1,0 +366,1,22020,13-May-21,06:06,0,0,0,1,0 +367,1,22080,13-May-21,06:07,0,0,0,1,0 +368,1,22140,13-May-21,06:08,0,0,0,1,0 +369,1,22200,13-May-21,06:09,0,0,0,1,0 +370,1,22260,13-May-21,06:10,0,0,0,1,0 +371,1,22320,13-May-21,06:11,0,0,0,1,0 +372,1,22380,13-May-21,06:12,0,0,0,1,0 +373,1,22440,13-May-21,06:13,0,0,0,1,0 +374,1,22500,13-May-21,06:14,0,0,0,1,0 +375,1,22560,13-May-21,06:15,0,0,0,1,0 +376,1,22620,13-May-21,06:16,0,0,0,1,0 +377,1,22680,13-May-21,06:17,0,0,0,1,0 +378,1,22740,13-May-21,06:18,0,0,0,1,0 +379,1,22800,13-May-21,06:19,0,0,0,1,0 +380,1,22860,13-May-21,06:20,0,0,0,1,0 +381,1,22920,13-May-21,06:21,0,0,0,1,0 +382,1,22980,13-May-21,06:22,0,0,0,1,0 +383,1,23040,13-May-21,06:23,0,0,0,1,0 +384,1,23100,13-May-21,06:24,0,0,0,1,0 +385,1,23160,13-May-21,06:25,0,0,0,1,0 +386,1,23220,13-May-21,06:26,0,0,0,1,0 +387,1,23280,13-May-21,06:27,0,0,0,1,0 +388,1,23340,13-May-21,06:28,0,0,0,1,0 +389,1,23400,13-May-21,06:29,0,0,0,1,0 +390,1,23460,13-May-21,06:30,0,0,0,1,0 +391,1,23520,13-May-21,06:31,0,0,0,1,0 +392,1,23580,13-May-21,06:32,0,0,0,1,0 +393,1,23640,13-May-21,06:33,0,0,0,1,0 +394,1,23700,13-May-21,06:34,0,0,0,1,0 +395,1,23760,13-May-21,06:35,0,0,0,1,0 +396,1,23820,13-May-21,06:36,0,0,0,1,0 +397,1,23880,13-May-21,06:37,0,0,0,1,0 +398,1,23940,13-May-21,06:38,0,0,0,1,0 +399,1,24000,13-May-21,06:39,0,0,0,1,0 +400,1,24060,13-May-21,06:40,0,0,0,1,0 +401,1,24120,13-May-21,06:41,0,0,0,1,0 +402,1,24180,13-May-21,06:42,0,0,0,1,0 +403,1,24240,13-May-21,06:43,0,0,0,1,0 +404,1,24300,13-May-21,06:44,0,0,0,1,0 +405,1,24360,13-May-21,06:45,0,0,0,1,0 +406,1,24420,13-May-21,06:46,0,0,0,1,0 +407,1,24480,13-May-21,06:47,0,0,0,1,0 +408,1,24540,13-May-21,06:48,0,0,0,1,0 +409,1,24600,13-May-21,06:49,0,0,0,1,0 +410,1,24660,13-May-21,06:50,0,0,0,1,0 +411,1,24720,13-May-21,06:51,0,0,0,1,0 +412,1,24780,13-May-21,06:52,0,0,0,1,0 +413,1,24840,13-May-21,06:53,0,0,0,1,0 +414,1,24900,13-May-21,06:54,0,0,0,1,0 +415,1,24960,13-May-21,06:55,0,0,0,1,0 +416,1,25020,13-May-21,06:56,0,0,0,1,0 +417,1,25080,13-May-21,06:57,0,0,0,1,0 +418,1,25140,13-May-21,06:58,0,0,0,1,0 +419,1,25200,13-May-21,06:59,0,0,0,1,0 +420,1,25260,13-May-21,07:00,0,0,0,1,0 +421,1,25320,13-May-21,07:01,0,0,0,1,0 +422,1,25380,13-May-21,07:02,0,0,0,1,0 +423,1,25440,13-May-21,07:03,0,0,0,1,0 +424,1,25500,13-May-21,07:04,0,0,0,1,0 +425,1,25560,13-May-21,07:05,0,0,0,1,0 +426,1,25620,13-May-21,07:06,0,0,0,1,0 +427,1,25680,13-May-21,07:07,0,0,0,1,0 +428,1,25740,13-May-21,07:08,0,0,0,1,0 +429,1,25800,13-May-21,07:09,0,0,0,1,0 +430,1,25860,13-May-21,07:10,0,0,0,1,0 +431,1,25920,13-May-21,07:11,0,0,0,1,0 +432,1,25980,13-May-21,07:12,0,0,0,1,0 +433,1,26040,13-May-21,07:13,0,0,0,1,0 +434,1,26100,13-May-21,07:14,0,0,0,1,0 +435,1,26160,13-May-21,07:15,0,0,0,1,0 +436,1,26220,13-May-21,07:16,0,0,0,1,0 +437,1,26280,13-May-21,07:17,0,0,0,1,0 +438,1,26340,13-May-21,07:18,0,0,0,1,0 +439,1,26400,13-May-21,07:19,0,0,0,1,0 +440,1,26460,13-May-21,07:20,0,0,0,1,0 +441,1,26520,13-May-21,07:21,0,0,0,1,0 +442,1,26580,13-May-21,07:22,0,0,0,1,0 +443,1,26640,13-May-21,07:23,0,0,0,1,0 +444,1,26700,13-May-21,07:24,0,0,0,1,0 +445,1,26760,13-May-21,07:25,0,0,0,1,0 +446,1,26820,13-May-21,07:26,0,0,0,1,0 +447,1,26880,13-May-21,07:27,0,0,0,1,0 +448,1,26940,13-May-21,07:28,0,0,0,1,0 +449,1,27000,13-May-21,07:29,0,0,0,1,0 +450,1,27060,13-May-21,07:30,0,0,0,1,0 +451,1,27120,13-May-21,07:31,0,0,0,1,0 +452,1,27180,13-May-21,07:32,0,0,0,1,0 +453,1,27240,13-May-21,07:33,0,0,0,1,0 +454,1,27300,13-May-21,07:34,0,0,0,1,0 +455,1,27360,13-May-21,07:35,0,0,0,1,0 +456,1,27420,13-May-21,07:36,0,0,0,1,0 +457,1,27480,13-May-21,07:37,0,0,0,1,0 +458,1,27540,13-May-21,07:38,0,0,0,1,0 +459,1,27600,13-May-21,07:39,0,0,0,1,0 +460,1,27660,13-May-21,07:40,0,0,0,1,0 +461,1,27720,13-May-21,07:41,0,0,0,1,0 +462,1,27780,13-May-21,07:42,0,0,0,1,0 +463,1,27840,13-May-21,07:43,0,0,0,1,0 +464,1,27900,13-May-21,07:44,0,0,0,1,0 +465,1,27960,13-May-21,07:45,0,0,0,1,0 +466,1,28020,13-May-21,07:46,0,0,0,1,0 +467,1,28080,13-May-21,07:47,0,0,0,1,0 +468,1,28140,13-May-21,07:48,0,0,0,1,0 +469,1,28200,13-May-21,07:49,0,0,0,1,0 +470,1,28260,13-May-21,07:50,0,0,0,1,0 +471,1,28320,13-May-21,07:51,0,0,0,1,0 +472,1,28380,13-May-21,07:52,0,0,0,1,0 +473,1,28440,13-May-21,07:53,0,0,0,1,0 +474,1,28500,13-May-21,07:54,0,0,0,1,0 +475,1,28560,13-May-21,07:55,0,0,0,1,0 +476,1,28620,13-May-21,07:56,0,0,0,1,0 +477,1,28680,13-May-21,07:57,0,0,0,1,0 +478,1,28740,13-May-21,07:58,0,0,0,1,0 +479,1,28800,13-May-21,07:59,0,0,0,1,0 +480,1,28860,13-May-21,08:00,0,0,0,1,0 +481,1,28920,13-May-21,08:01,0,0,0,1,0 +482,1,28980,13-May-21,08:02,0,0,0,1,0 +483,1,29040,13-May-21,08:03,0,0,0,1,0 +484,1,29100,13-May-21,08:04,0,0,0,1,0 +485,1,29160,13-May-21,08:05,0,0,0,1,0 +486,1,29220,13-May-21,08:06,0,0,0,1,0 +487,1,29280,13-May-21,08:07,0,0,0,1,0 +488,1,29340,13-May-21,08:08,0,0,0,1,0 +489,1,29400,13-May-21,08:09,0,0,0,1,0 +490,1,29460,13-May-21,08:10,0,0,0,1,0 +491,1,29520,13-May-21,08:11,0,0,0,1,0 +492,1,29580,13-May-21,08:12,0,0,0,1,0 +493,1,29640,13-May-21,08:13,0,0,0,1,0 +494,1,29700,13-May-21,08:14,0,0,0,1,0 +495,1,29760,13-May-21,08:15,0,0,0,1,0 +496,1,29820,13-May-21,08:16,0,0,0,1,0 +497,1,29880,13-May-21,08:17,0,0,0,1,0 +498,1,29940,13-May-21,08:18,0,0,0,1,0 +499,1,30000,13-May-21,08:19,0,0,0,1,0 +500,1,30060,13-May-21,08:20,0,0,0,1,0 diff --git a/man/readActicalCount.Rd b/man/readActicalCount.Rd new file mode 100644 index 0000000..f220b5f --- /dev/null +++ b/man/readActicalCount.Rd @@ -0,0 +1,40 @@ +\name{readActicalCount} +\alias{readActicalCount} +\title{ + Read Actical Count data files (csv) +} +\description{ + Reads Actical Count data file. +} +\usage{ + readActicalCount(filename = file, desiredEpochSize = NULL, + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", + timeformatName = "timeformat") +} +\arguments{ + \item{filename}{ + filename (required) + } + \item{desiredEpochSize}{ + Numeric, desired epoch size in seconds. If set aggregate data by summation to + this epochsize. + } + \item{timeformat}{ + Character, timestemp format. + } + \item{tz}{ + Character, timezone name from the timezone database names. + } + \item{timeformatName}{ + Character, name of timeformat variable to print in error message when + timeformat is incorrect, of use to GGIR where argument names can differ. + } +} +\value{ + \item{data}{Matrix with one or multiple columns} + \item{epochSize}{epoch size in seconds of data} + \item{startTime}{POSIXlt format timestamp on which recording starts } +} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/man/readActiwatchCount.Rd b/man/readActiwatchCount.Rd index 7419267..ace96b9 100644 --- a/man/readActiwatchCount.Rd +++ b/man/readActiwatchCount.Rd @@ -34,8 +34,6 @@ \item{data}{Matrix with one or multiple columns} \item{epochSize}{epoch size in seconds of data} \item{startTime}{POSIXlt format timestamp on which recording starts } - \item{deviceSerialNumber}{Device serial number if it could be extracted - from the file header} } \author{ Vincent T van Hees diff --git a/tests/testthat/test_readActicalCount.R b/tests/testthat/test_readActicalCount.R new file mode 100644 index 0000000..f8dbd2d --- /dev/null +++ b/tests/testthat/test_readActicalCount.R @@ -0,0 +1,31 @@ +library(GGIRread) +context("read Actical files") +test_that("Actical csv is correctly read", { + file = system.file("testfiles/Actical.csv", package = "GGIRread") + D = readActicalCount(filename = file, desiredEpochSize = 60, timeformat = "%d-%b-%y %H:%M", tz = "") + expect_equal(D$epochSize, 60) + expect_equal(format(D$startTime), "2021-05-13 00:01:00") + expect_equal(nrow(D$data), 500) + expect_equal(ncol(D$data), 2) + expect_equal(sum(D$data, na.rm = TRUE), 8174) + + D = readActicalCount(filename = file, desiredEpochSize = 120, timeformat = "%d-%b-%y %H:%M", tz = "") + expect_equal(D$epochSize, 120) + expect_equal(format(D$startTime), "2021-05-13 00:01:00") + expect_equal(nrow(D$data), 250) + expect_equal(ncol(D$data), 2) + expect_equal(sum(D$data, na.rm = TRUE), 8174) +}) + +test_that("Actical csv error correctly", { + file = system.file("testfiles/Actical.csv", package = "GGIRread") + expect_error(readActicalCount(filename = file, + desiredEpochSize = 60, + timeformat = "%d/%m/%Y %H:%M", tz = ""), + regexp = "Time format*") + + expect_error(readActicalCount(filename = file, + desiredEpochSize = 5, + timeformat = "%d-%b-%y %H:%M", tz = ""), + regexp = "The short*") +}) \ No newline at end of file From 952d2e4ba11ae85fd90d0faf2446c82e6014f762 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 09:23:31 +0200 Subject: [PATCH 06/25] reduce code duplication #68 --- R/readActicalCount.R | 45 +++++++++-------------------------------- R/readActiwatchCount.R | 44 ++++++++++------------------------------ R/utils_for_countdata.R | 33 ++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 68 deletions(-) diff --git a/R/readActicalCount.R b/R/readActicalCount.R index 011d13d..e797cfb 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -1,42 +1,17 @@ readActicalCount = function(filename = file, desiredEpochSize = NULL, - timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { + timeformat = "%m/%d/%Y %H:%M:%S", tz = "", + timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat - # ! Assumptions that timeseries start before line 1000 - index = 300 - while (index > 0) { - quote = detectQuote(fn = filename, index = index) - testraw = data.table::fread(input = filename, - header = FALSE, sep = ",", skip = index, - nrows = 2, data.table = FALSE, quote = quote) - if (length(testraw) > 0) { - if (nrow(testraw) == 2) { - if (testraw$V1[2] == testraw$V1[1] + 1) { - break - } - } - } - index = index - 100 - } - # ! Assumption that first column are the epoch numbers - delta = 1 - testraw$V1[1] - index = index + delta - startFound = FALSE - while (startFound == FALSE) { - Dtest = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, nrows = 1) - if (Dtest$V1[1] == 1) { - startFound = TRUE - } else { - # This happens when file is has an empty row between each measurement point is stored - index = index - 1 - if (index < 1) stop("Could not find start of recording", call. = FALSE) - } - } - D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, data.table = FALSE) + startindex = 300 + quote = detectQuote(fn = filename, index = startindex) + startindex = findStartData(filename, quote, startindex) + D = data.table::fread(input = filename, sep = ",", skip = startindex, + quote = quote, data.table = FALSE) # ! Assumption that column names are present 2 lines prior to timeseries dashedlineFound = FALSE - dashedLineIndex = index + dashedLineIndex = startindex while (dashedlineFound == FALSE) { linedata = data.table::fread(input = filename, data.table = FALSE, header = FALSE, sep = ",", @@ -49,8 +24,8 @@ readActicalCount = function(filename = file, desiredEpochSize = NULL, } colnames = data.table::fread(input = filename, data.table = FALSE, header = FALSE, sep = ",", - skip = dashedLineIndex + 1, nrows = (index - dashedLineIndex) - 2, quote = quote) - + skip = dashedLineIndex + 1, + nrows = (startindex - dashedLineIndex) - 2, quote = quote) collapse = function(x) { return(paste0(x, collapse = "_")) } diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index e5e8416..76d9c76 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -1,5 +1,6 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, - timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { + timeformat = "%m/%d/%Y %H:%M:%S", tz = "", + timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat fileExtension = tolower(getExtension(filename)) @@ -9,35 +10,9 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, # CSV #========================================================= # ! Assumptions that timeseries start before line 1000 - index = 1000 - while (index > 0) { - quote = detectQuote(fn = filename, index = index) - testraw = data.table::fread(input = filename, - header = FALSE, sep = ",", skip = index, - nrows = 2, data.table = FALSE, quote = quote) - if (length(testraw) > 0) { - if (nrow(testraw) == 2) { - if (testraw$V1[2] == testraw$V1[1] + 1) { - break - } - } - } - index = index - 100 - } - # ! Assumption that first column are the epoch numbers - delta = 1 - testraw$V1[1] - index = index + delta - startFound = FALSE - while (startFound == FALSE) { - Dtest = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, nrows = 1) - if (Dtest$V1[1] == 1) { - startFound = TRUE - } else { - # This happens when file is has an empty row between each measurement point is stored - index = index - 1 - if (index < 1) stop("Could not find start of recording", call. = FALSE) - } - } + startindex = 1000 + quote = detectQuote(fn = filename, index = startindex) + index = findStartData(filename, quote, startindex) D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote) # ! Assumption that column names are present 2 lines prior to timeseries colnames = data.table::fread(input = filename, @@ -50,9 +25,12 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, } colnames(D) = as.character(colnames)[1:ncol(D)] # ! Assumptions about columns names - colnames(D) = gsub(pattern = "datum|date", replacement = "date", x = colnames(D), ignore.case = TRUE) - colnames(D) = gsub(pattern = "tijd|time", replacement = "time", x = colnames(D), ignore.case = TRUE) - colnames(D) = gsub(pattern = "activiteit|activity", replacement = "ZCY", x = colnames(D), ignore.case = TRUE) + colnames(D) = gsub(pattern = "datum|date", replacement = "date", + x = colnames(D), ignore.case = TRUE) + colnames(D) = gsub(pattern = "tijd|time", replacement = "time", + x = colnames(D), ignore.case = TRUE) + colnames(D) = gsub(pattern = "activiteit|activity", replacement = "ZCY", + x = colnames(D), ignore.case = TRUE) timestamp_POSIX = as.POSIXct(x = paste(D$date[1:4], D$time[1:4], sep = " "), format = timeformat, tz = tz) diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R index 3491cea..e2112b6 100644 --- a/R/utils_for_countdata.R +++ b/R/utils_for_countdata.R @@ -73,4 +73,37 @@ sumAggregate = function(mat, step) { mat = mat[seq(1, nrow(mat), by = step), , drop = FALSE] mat = apply(mat, 2, diff) return(mat) +} + +findStartData = function(filename, quote, startindex) { + # Function used to find start of time series in Actiwatch and Actical data + # ! Assumptions that timeseries start before line 1000 + while (startindex > 0) { + testraw = data.table::fread(input = filename, + header = FALSE, sep = ",", skip = startindex, + nrows = 2, data.table = FALSE, quote = quote) + if (length(testraw) > 0) { + if (nrow(testraw) == 2) { + if (testraw$V1[2] == testraw$V1[1] + 1) { + break + } + } + } + startindex = startindex - 100 + } + # ! Assumption that first column are the epoch numbers + delta = 1 - testraw$V1[1] + startindex = startindex + delta + startFound = FALSE + while (startFound == FALSE) { + Dtest = data.table::fread(input = filename, sep = ",", skip = startindex, quote = quote, nrows = 1) + if (Dtest$V1[1] == 1) { + startFound = TRUE + } else { + # This happens when file is has an empty row between each measurement point is stored + startindex = startindex - 1 + if (startindex < 1) stop("Could not find start of recording", call. = FALSE) + } + } + return(startindex) } \ No newline at end of file From 38669dbdc20fa6b770ba29508714bb64682eb976 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 10:43:49 +0200 Subject: [PATCH 07/25] extract additional columns from files #68 --- R/readActiGraphCount.R | 51 +++++++++++++++++------- R/readActicalCount.R | 5 +-- R/readActiwatchCount.R | 32 ++++++++------- R/utils_for_countdata.R | 10 ++++- tests/testthat/test_readActiGraphCount.R | 32 +++++++++------ tests/testthat/test_readActiwatchCount.R | 22 ++++++---- 6 files changed, 96 insertions(+), 56 deletions(-) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R index 1455c73..f12c7b1 100644 --- a/R/readActiGraphCount.R +++ b/R/readActiGraphCount.R @@ -34,8 +34,12 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, if (any(grepl("serialnumber", fileHeader$item))) headerAvailable = TRUE # Depending on whether header is present assign number of rows to skip: + mode = NULL if (headerAvailable == TRUE) { skip = 10 + # Extract mode number from header because this tells us how to interpret the columns + mode = as.numeric(fileHeader$value[grep(pattern = "mode", x = fileHeader$item)]) + if (is.na(mode)) mode = NULL } else { tmp = data.table::fread(input = filename, header = FALSE, @@ -80,33 +84,50 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, D = D[, -1, drop = FALSE] } # Identify columns with count data - acccol = vmcol = NA + acccol = NA + stepcol = NULL if (colnames == TRUE) { acccol = grep("axis|activity", colnames(D), ignore.case = TRUE) vmcol = grep("vector magnitude|vm", colnames(D), ignore.case = TRUE) + stepcol = grep("step", colnames(D), ignore.case = TRUE) } else { - # Then assume first 3 columns are axis1, axis2, axis3 if ncol(D) >= 3 - # First column is VM if ncol(D) < 3 - # Note that in ActiLife software the user can select - # the columns to export (e.g, it could be "Axis1", "Vector Magnitude", "Steps") - # which may mean that our assumptions here are not necessarily true. - if (ncol(D) >= 3) { - acccol = 1:3 + if (!is.null(mode)) { + if ((mode >= 12 && mode <= 15) | (mode >= 28 && mode <= 31) | + (mode >= 44 && mode <= 47) | (mode >= 60 && mode <= 63)) { + acccol = 1:3 + } else { + acccol = 1 + } + if (mode %in% c(13, 15, 29, 31, 45, 47, 61, 63)) { + stepcol = 4 + } } else { - vmcol = 1 + # Then assume first 3 columns are axis1, axis2, axis3 if ncol(D) >= 3 + # First column is VM if ncol(D) < 3 + # Note that in ActiLife software the user can select + # the columns to export (e.g, it could be "Axis1", "Vector Magnitude", "Steps") + # which may mean that our assumptions here are not necessarily true. + if (ncol(D) >= 3) { + acccol = 1:3 + } else { + acccol = 1 + } } } # Assign colnames and formatting - if (is.na(acccol[1]) == FALSE) { + if (length(acccol) == 3 && is.na(acccol[1]) == FALSE) { colnames(D)[acccol] = c("y", "x", "z") # ActiGraph always stores y axis first } - if (is.na(vmcol[1]) == FALSE) { + if (length(acccol) == 1 &&is.na(vmcol[1]) == FALSE) { D = as.matrix(D, drop = FALSE) # Convert to matrix as data.frame will auto-collapse to vector - colnames(D)[vmcol] = c("vm") + colnames(D)[acccol] = "vm" + } + if (length(stepcol) == 1 && is.na(stepcol[1]) == FALSE) { + colnames(D)[stepcol] = "steps" } - keep = c(acccol, vmcol)[!is.na(c(acccol, vmcol))] + keep = c(acccol, stepcol)[!is.na(c(acccol, stepcol))] D = D[, keep, drop = FALSE] - if (ncol(D) == 3 & is.na(vmcol)) { + if (ncol(D) >= 3) { D$vm = sqrt(D[, 1] ^ 2 + D[, 2] ^ 2 + D[, 3] ^ 2) } # Extract information from header, if present @@ -154,7 +175,7 @@ readActiGraphCount = function(filename = file, desiredEpochSize = NULL, if (!is.null(desiredEpochSize)) { if (desiredEpochSize > epSizeShort) { step = desiredEpochSize %/% epSizeShort - D = sumAggregate(D, step) + D = matAggregate(D, step) epSizeShort = epSizeShort * step } checkEpochMatch(desiredEpochSize, epSizeShort) diff --git a/R/readActicalCount.R b/R/readActicalCount.R index e797cfb..9896ddd 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -48,18 +48,17 @@ readActicalCount = function(filename = file, desiredEpochSize = NULL, timestamp_POSIX = timestamp_POSIX[1] D = D[, -which(colnames(D) %in% c("date", "time"))] D = as.matrix(D, drop = FALSE) - + if (quote == "") D = apply(D, 2, as.numeric) # If requested, aggregate data to lower resolution to match desired # epoch size in argument windowsizes if (!is.null(desiredEpochSize)) { if (desiredEpochSize > epSizeShort) { step = desiredEpochSize %/% epSizeShort - D = sumAggregate(D, step) + D = matAggregate(D, step) epSizeShort = epSizeShort * step } checkEpochMatch(desiredEpochSize, epSizeShort) } - if (quote == "") D = apply(D, 2, as.numeric) invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX)) } \ No newline at end of file diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index 76d9c76..53fe822 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -13,9 +13,9 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, startindex = 1000 quote = detectQuote(fn = filename, index = startindex) index = findStartData(filename, quote, startindex) - D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote) + D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, data.table = FALSE) # ! Assumption that column names are present 2 lines prior to timeseries - colnames = data.table::fread(input = filename, + colnames = data.table::fread(input = filename, data.table = FALSE, header = FALSE, sep = ",", skip = index - 2, nrows = 1, quote = quote) if (all(is.na(colnames))) { @@ -23,14 +23,17 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, header = FALSE, sep = ",", skip = index - 4, nrows = 1, quote = quote) } - colnames(D) = as.character(colnames)[1:ncol(D)] + colnames = colnames[!is.na(colnames)] + D = D[, which(!is.na(colnames))] + colnames(D) = tolower(as.character(colnames)) # ! Assumptions about columns names - colnames(D) = gsub(pattern = "datum|date", replacement = "date", - x = colnames(D), ignore.case = TRUE) - colnames(D) = gsub(pattern = "tijd|time", replacement = "time", - x = colnames(D), ignore.case = TRUE) - colnames(D) = gsub(pattern = "activiteit|activity", replacement = "ZCY", - x = colnames(D), ignore.case = TRUE) + # browser() + colnames(D)[grep(pattern = "datum|date", x = colnames(D))] = "date" + colnames(D)[grep(pattern = "tijd|time", x = colnames(D))] = "time" + colnames(D)[grep(pattern = "activiteit|activity", x = colnames(D))] = "counts" + colnames(D)[grep(pattern = "slapen|sleep", x = colnames(D))] = "sleep" + colnames(D)[grep(pattern = "niet-om|wear|worn", x = colnames(D))] = "nonwear" + D = D[, grep(pattern = "time|date|counts|sleep|nonwear", x = colnames(D))] timestamp_POSIX = as.POSIXct(x = paste(D$date[1:4], D$time[1:4], sep = " "), format = timeformat, tz = tz) @@ -41,7 +44,7 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, epSizeShort = mean(diff(as.numeric(timestamp_POSIX))) timestamp_POSIX = timestamp_POSIX[1] - D = D[, "ZCY"] + D = D[, -which(colnames(D) %in% c("date", "time"))] } else if (fileExtension == "awd") { #========================================================= # AWD @@ -64,8 +67,8 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, } D = data.table::fread(input = filename, header = FALSE, sep = ",", skip = index, quote = quote) - D = D[,1] - colnames(D)[1] = "ZCY" + D = D[, 1:2] + colnames(D)[1:2] = c("counts", "light") header = data.table::fread(input = filename, header = FALSE, sep = ",", nrows = 7, quote = quote) # Get epoch size @@ -83,18 +86,17 @@ readActiwatchCount = function(filename = file, desiredEpochSize = NULL, } D = as.matrix(D, drop = FALSE) - + if (quote == "") D = apply(D, 2, as.numeric) # If requested, aggregate data to lower resolution to match desired # epoch size in argument windowsizes if (!is.null(desiredEpochSize)) { if (desiredEpochSize > epSizeShort) { step = desiredEpochSize %/% epSizeShort - D = sumAggregate(D, step) + D = matAggregate(D, step) epSizeShort = epSizeShort * step } checkEpochMatch(desiredEpochSize, epSizeShort) } - if (quote == "") D$ZCY = as.numeric(D$ZCY) invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX)) } \ No newline at end of file diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R index e2112b6..61773c4 100644 --- a/R/utils_for_countdata.R +++ b/R/utils_for_countdata.R @@ -62,8 +62,10 @@ getExtension <- function(filename){ return(ex[-1]) } -sumAggregate = function(mat, step) { - # Aggregate matrix mat by taking the sum over step number of rows +matAggregate = function(mat, step) { + # Aggregate matrix mat by taking over step number of rows + # as sum unless column names is sleep or nonwear in that case + # we take the rounded mean. mat = rbind(rep(0, ncol(mat)), mat) cumsum2 = function(x) { x = cumsum(ifelse(is.na(x), 0, x)) + x*0 @@ -72,6 +74,10 @@ sumAggregate = function(mat, step) { mat = apply(mat, 2, cumsum2) mat = mat[seq(1, nrow(mat), by = step), , drop = FALSE] mat = apply(mat, 2, diff) + # Correct non incremental variables + for (niv in c("sleep", "nonwear")) { + if (niv %in% colnames(D)) D[, niv] = round(D[, niv] / step) + } return(mat) } diff --git a/tests/testthat/test_readActiGraphCount.R b/tests/testthat/test_readActiGraphCount.R index 6e9a2db..73772a1 100644 --- a/tests/testthat/test_readActiGraphCount.R +++ b/tests/testthat/test_readActiGraphCount.R @@ -7,16 +7,18 @@ test_that("ActiGraph61 is correctly read", { expect_equal(D$epochSize, 10) expect_equal(format(D$startTime), "2016-08-15 21:35:00") expect_equal(nrow(D$data), 495) - expect_equal(ncol(D$data), 4) - expect_equal(sum(D$data), 63952.33) + expect_equal(ncol(D$data), 5) + expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 63952.33) + expect_equal(sum(D$data[, c("steps")]), 253) D = readActiGraphCount(filename = file, desiredEpochSize = 5, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") expect_equal(D$deviceSerialNumber, "MOS2D16160581") expect_equal(D$epochSize, 5) expect_equal(format(D$startTime), "2016-08-15 21:35:00") expect_equal(nrow(D$data), 990) - expect_equal(ncol(D$data), 4) - expect_equal(sum(D$data), 63952.33) + expect_equal(ncol(D$data), 5) + expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 63952.33) + expect_equal(sum(D$data[, c("steps")]), 253) }) test_that("ActiGraph31 is correctly read", { @@ -26,16 +28,19 @@ test_that("ActiGraph31 is correctly read", { expect_equal(D$epochSize, 15) expect_equal(format(D$startTime), "2013-08-26 09:00:00") expect_equal(nrow(D$data), 990) - expect_equal(ncol(D$data), 4) - expect_equal(sum(D$data), 272870.6, tol = 0.1) + expect_equal(ncol(D$data), 5) + expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 272870.6, tol = 0.1) + expect_equal(sum(D$data[, c("steps")]), 1118) D = readActiGraphCount(filename = file, desiredEpochSize = 30, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") expect_equal(D$deviceSerialNumber, "CLE2A2123456") expect_equal(D$epochSize, 30) expect_equal(format(D$startTime), "2013-08-26 09:00:00") expect_equal(nrow(D$data), 495) - expect_equal(ncol(D$data), 4) - expect_equal(sum(D$data), 272870.6, tol = 0.1) + expect_equal(ncol(D$data), 5) + expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 272870.6, tol = 0.1) + expect_equal(sum(D$data[, c("steps")]), 1118) + }) test_that("ActiGraph13_timestamps_headers.csv is correctly read", { @@ -45,17 +50,18 @@ test_that("ActiGraph13_timestamps_headers.csv is correctly read", { expect_equal(D$epochSize, 1) expect_equal(format(D$startTime), "2017-12-09 15:00:00") expect_equal(nrow(D$data), 1000) - expect_equal(ncol(D$data), 4) - expect_equal(sum(D$data), 256047) - + expect_equal(ncol(D$data), 5) + expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 255707.4, tol = 0.1) + expect_equal(sum(D$data[, c("steps")]), 442) D = readActiGraphCount(filename = file, desiredEpochSize = 5, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") expect_equal(D$deviceSerialNumber, "TAS1D48140206") expect_equal(D$epochSize, 5) expect_equal(format(D$startTime), "2017-12-09 15:00:00") expect_equal(nrow(D$data), 200) - expect_equal(ncol(D$data), 4) - expect_equal(sum(D$data), 256047) + expect_equal(ncol(D$data), 5) + expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 255707.4, tol = 0.1) + expect_equal(sum(D$data[, c("steps")]), 442) }) test_that("Actiwatch csv error correctly", { diff --git a/tests/testthat/test_readActiwatchCount.R b/tests/testthat/test_readActiwatchCount.R index e36dda0..23e76c0 100644 --- a/tests/testthat/test_readActiwatchCount.R +++ b/tests/testthat/test_readActiwatchCount.R @@ -6,15 +6,19 @@ test_that("Actiwatch csv is correctly read", { expect_equal(D$epochSize, 15) expect_equal(format(D$startTime), "2019-11-23 06:00:00") expect_equal(nrow(D$data), 860) - expect_equal(ncol(D$data), 1) - expect_equal(sum(D$data, na.rm = TRUE), 4589) + expect_equal(ncol(D$data), 3) + expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 4589) + expect_equal(sum(D$data[, "sleep"], na.rm = TRUE), 55) + expect_equal(sum(D$data[, "nonwear"], na.rm = TRUE), 797) D = readActiwatchCount(filename = file, desiredEpochSize = 30, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") expect_equal(D$epochSize, 30) expect_equal(format(D$startTime), "2019-11-23 06:00:00") expect_equal(nrow(D$data), 430) - expect_equal(ncol(D$data), 1) - expect_equal(sum(D$data, na.rm = TRUE), 4569) + expect_equal(ncol(D$data), 3) + expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 4569) + expect_equal(sum(D$data[, "sleep"], na.rm = TRUE), 54) + expect_equal(sum(D$data[, "nonwear"], na.rm = TRUE), 797) }) test_that("Actiwatch awd is correctly read", { file = system.file("testfiles/Actiwatch.AWD", package = "GGIRread") @@ -22,15 +26,17 @@ test_that("Actiwatch awd is correctly read", { expect_equal(D$epochSize, 60) expect_equal(format(D$startTime), "2009-10-01 17:00:00") expect_equal(nrow(D$data), 329) - expect_equal(ncol(D$data), 1) - expect_equal(sum(D$data, na.rm = TRUE), 108864) + expect_equal(ncol(D$data), 2) + expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 108864) + expect_equal(sum(D$data[, "light"], na.rm = TRUE), 0) D = readActiwatchCount(filename = file, desiredEpochSize = 300, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") expect_equal(D$epochSize, 300) expect_equal(format(D$startTime), "2009-10-01 17:00:00") expect_equal(nrow(D$data), 65) - expect_equal(ncol(D$data), 1) - expect_equal(sum(D$data, na.rm = TRUE), 108713) + expect_equal(ncol(D$data), 2) + expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 108713) + expect_equal(sum(D$data[, "light"], na.rm = TRUE), 0) }) test_that("Actiwatch awd error correctly", { From 43428d4db013759b731e93b2d49adf4634d32336 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 10:59:32 +0200 Subject: [PATCH 08/25] correct startindex for Actical which starts at epoch zero instead of 1 #68 --- R/readActicalCount.R | 2 ++ tests/testthat/test_readActicalCount.R | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/R/readActicalCount.R b/R/readActicalCount.R index 9896ddd..337c1e9 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -7,6 +7,8 @@ readActicalCount = function(filename = file, desiredEpochSize = NULL, startindex = 300 quote = detectQuote(fn = filename, index = startindex) startindex = findStartData(filename, quote, startindex) + # -1 because Actical starts at epoch 0 while function looks for epoch 1 + startindex = startindex - 1 D = data.table::fread(input = filename, sep = ",", skip = startindex, quote = quote, data.table = FALSE) # ! Assumption that column names are present 2 lines prior to timeseries diff --git a/tests/testthat/test_readActicalCount.R b/tests/testthat/test_readActicalCount.R index f8dbd2d..626a606 100644 --- a/tests/testthat/test_readActicalCount.R +++ b/tests/testthat/test_readActicalCount.R @@ -4,17 +4,17 @@ test_that("Actical csv is correctly read", { file = system.file("testfiles/Actical.csv", package = "GGIRread") D = readActicalCount(filename = file, desiredEpochSize = 60, timeformat = "%d-%b-%y %H:%M", tz = "") expect_equal(D$epochSize, 60) - expect_equal(format(D$startTime), "2021-05-13 00:01:00") - expect_equal(nrow(D$data), 500) + expect_equal(format(D$startTime), "2021-05-13") + expect_equal(nrow(D$data), 501) expect_equal(ncol(D$data), 2) - expect_equal(sum(D$data, na.rm = TRUE), 8174) + expect_equal(sum(D$data, na.rm = TRUE), 8436) D = readActicalCount(filename = file, desiredEpochSize = 120, timeformat = "%d-%b-%y %H:%M", tz = "") expect_equal(D$epochSize, 120) - expect_equal(format(D$startTime), "2021-05-13 00:01:00") + expect_equal(format(D$startTime), "2021-05-13") expect_equal(nrow(D$data), 250) expect_equal(ncol(D$data), 2) - expect_equal(sum(D$data, na.rm = TRUE), 8174) + expect_equal(sum(D$data, na.rm = TRUE), 8436) }) test_that("Actical csv error correctly", { From 33a8b2cd48901bcb5d9252f23a24f681dadab92f Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 13:24:18 +0200 Subject: [PATCH 09/25] add function to read and merge Philips Health Band xlsx file pairs #68 --- DESCRIPTION | 2 +- NAMESPACE | 2 +- NEWS.md | 5 +- R/mergePHBfilePairs.R | 66 ++++++++++++++++++ ...taList_AH1234567890_PhilipsHealthBand.xlsx | Bin 0 -> 57421 bytes ...p_Wake_AH1234567890_PhilipsHealthBand.xlsx | Bin 0 -> 25848 bytes man/mergePHBfilePairs.Rd | 30 ++++++++ tests/testthat/test_mergePHBfilePairs.R | 33 +++++++++ 8 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 R/mergePHBfilePairs.R create mode 100644 inst/testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx create mode 100644 inst/testfiles/Sleep_Wake_AH1234567890_PhilipsHealthBand.xlsx create mode 100644 man/mergePHBfilePairs.Rd create mode 100644 tests/testthat/test_mergePHBfilePairs.R diff --git a/DESCRIPTION b/DESCRIPTION index 0536150..2bfb8d6 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,7 +22,7 @@ URL: https://github.com/wadpac/GGIRread/ BugReports: https://github.com/wadpac/GGIRread/issues License: Apache License (== 2.0) Suggests: testthat -Imports: matlab, bitops, Rcpp (>= 0.12.10), data.table +Imports: matlab, bitops, Rcpp (>= 0.12.10), data.table, readxl Depends: stats, utils, R (>= 3.5.0) NeedsCompilation: yes LinkingTo: Rcpp diff --git a/NAMESPACE b/NAMESPACE index bbd7ca6..465eca0 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,5 +6,5 @@ useDynLib(GGIRread, .registration = TRUE) importFrom(Rcpp, sourceCpp) importFrom(data.table, fread) importFrom("utils", "setTxtProgressBar", "txtProgressBar") -importFrom("utils", "read.csv") +importFrom("utils", "read.csv", "write.csv") importFrom("utils", "available.packages") \ No newline at end of file diff --git a/NEWS.md b/NEWS.md index 4564353..1d6a235 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,12 +3,15 @@ - Added a `NEWS.md` file to track changes to the package. - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. - Migrate read function for ActiGraph (csv) and Actiwatch (csv/awd) count data to GGIRread #68. -- Add read function for Actical (csv) count data #68. +- Add function for reading Actical (csv) count data #68. +- Add function to read and merge Philips Health Band file pairs (xlsx) #68. + # Changes in version 1.0.1 (release date:03-06-2024) - Progress bar fixed, issue #63 (credits: John Muschelli) + # Changes in version 1.0.0 (release date:27-03-2024) - GENEActiv no longer prints error to console when more data is requested diff --git a/R/mergePHBfilePairs.R b/R/mergePHBfilePairs.R new file mode 100644 index 0000000..8f8f3a3 --- /dev/null +++ b/R/mergePHBfilePairs.R @@ -0,0 +1,66 @@ +mergePHBfilePairs = function(inputPath = ".", outputPath = ".") { + # merges Philips Health Band xlsx files per participant + # as there can be multiple files per participant. + + fnames = dir(inputPath, recursive = FALSE, full.names = TRUE, pattern = "[.]xlsx") + fileOverview = data.frame(filename = fnames) + + extractID = function(x) { + x = basename(x) + x = gsub(pattern = "sleep_wake", replacement = "sleepwake", x = tolower(x)) + ID = unlist(strsplit(x, "_"))[2] + return(ID) + } + fileOverview$ID = unlist(lapply(fileOverview$filename, FUN = extractID)) + + uids = unique(fileOverview$ID) + for (uid in uids) { + filesForThisPerson = fileOverview$filename[which(fileOverview$ID == uid)] + # Identify both file + file1 = grep(pattern = "datalist", x = filesForThisPerson, ignore.case = TRUE) + file2 = grep(pattern = "sleep_wake", x = filesForThisPerson, ignore.case = TRUE) + if (length(file1) == 0 && length(file2) == 0) { + next + } + # Data + if (length(file1) > 0) { + data1 = as.data.frame(readxl::read_excel(path = filesForThisPerson[file1], + col_types = "text", skip = 8), + row.names = FALSE) + header = as.data.frame(readxl::read_excel(path = filesForThisPerson[file1], + col_types = "text", n_max = 8, + .name_repair = "unique_quiet"), + row.names = FALSE)[, 1] + SNlocation = grep(pattern = "deviceSN", x = header) + if (length(SNlocation) > 0) { + deviceSN = unlist(strsplit(header[grep(pattern = "deviceSN", x = header)], " ")) + deviceSN = deviceSN[length(deviceSN)] + } else { + deviceSN = NULL + } + colnames(data1)[grep(pattern = "counts", x = colnames(data1), ignore.case = TRUE)] = "counts" + colnames(data1)[grep(pattern = "offWrist", x = colnames(data1), ignore.case = TRUE)] = "nonwear" + } + # Sleep wake scores + if (length(file2) > 0) { + data2 = as.data.frame(readxl::read_excel(path = filesForThisPerson[file2], col_types = "text", skip = 8), row.names = FALSE) + colnames(data2)[grep(pattern = "sleepWake", x = colnames(data2), ignore.case = TRUE)] = "sleep" + } + if (length(file1) > 0 && length(file2) > 0) { + data2 = data2[, which(colnames(data2) != "sleepEventMarker")] + data = merge(data1, data2, by = "timeStamp") + } else { + if (length(file1) > 0) { + data = data1 + } else { + data = data2 + } + } + colnames(data)[grep(pattern = "timeStamp", x = colnames(data))] = "timestamp" + newName = gsub(pattern = "Sleep_Wake", replacement = "def", x = basename(filesForThisPerson[file2])) + newName = paste0(unlist(strsplit(newName, "[.]")) , collapse = paste0("_", deviceSN, ".")) + newName = gsub(pattern = "xlsx", replacement = "csv", x = newName) + outputfile = paste0(outputPath, "/", newName) + write.csv(x = data, file = outputfile, row.names = FALSE) + } +} \ No newline at end of file diff --git a/inst/testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx b/inst/testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3c9c4e46347cb0abae290842888c53302145b10b GIT binary patch literal 57421 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 T +} \ No newline at end of file diff --git a/tests/testthat/test_mergePHBfilePairs.R b/tests/testthat/test_mergePHBfilePairs.R new file mode 100644 index 0000000..d516697 --- /dev/null +++ b/tests/testthat/test_mergePHBfilePairs.R @@ -0,0 +1,33 @@ +library(GGIRread) +context("merge PHB files") +test_that("merging of PHB files goes correctly", { + # prepare folder with test files + file1 = system.file("testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") + file2 = system.file("testfiles/Sleep_Wake_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") + path = "./phb_test_folder" + if (!dir.exists(path)) { + dir.create(path) + } + invisible(file.copy(from = file1, to = path, overwrite = TRUE)) + invisible(file.copy(from = file2, to = path, overwrite = TRUE)) + + # apply function to merge the files + mergePHBfilePairs(inputPath = path, outputPath = path) + + # check whether merged file exists + newfiles = dir(path, full.names = TRUE) + newFile = newfiles[grep(pattern = "def_AH1234567890_PhilipsHealthBand_000100621938.csv", x = newfiles)] + expect_true(length(newFile) == 1) + + # check file content + data = read.csv(newFile) + expect_equal(nrow(data), 246) + expect_equal(ncol(data), 19) + expect_equal(sum(data$counts), 50898) + expect_equal(sum(data$steps), 1) + expect_equal(data$timestamp[1], "11-05-2022 01:10:00") + + # clean up + if (dir.exists(path)) unlink(path, recursive = TRUE) +}) + \ No newline at end of file From fac8ef30843e353e9ea4a1b3bc48795f532b1b55 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 13:29:32 +0200 Subject: [PATCH 10/25] add new mergePHBfilePairs to namespace and add example output file #68 --- NAMESPACE | 2 +- ...4567890_PhilipsHealthBand_000100621938.csv | 247 ++++++++++++++++++ 2 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv diff --git a/NAMESPACE b/NAMESPACE index 465eca0..2be517a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,7 +1,7 @@ export(readGenea, readAxivity, readGENEActiv, GENEActivReader, resample, readWav, readActiGraphCount, readActiwatchCount, - readActicalCount) + readActicalCount, mergePHBfilePairs) useDynLib(GGIRread, .registration = TRUE) importFrom(Rcpp, sourceCpp) importFrom(data.table, fread) diff --git a/inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv b/inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv new file mode 100644 index 0000000..b464778 --- /dev/null +++ b/inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv @@ -0,0 +1,247 @@ +"timestamp","counts","heartRate","respirationRate","totalEnergyExpenditure","activeEnergyExpenditure","steps","nonwear","runDuration","walkDuration","activeMinutes","restingHeartRate","heartRateRecovery","cardioFitnessIndex","vo2Max","batteryDischarge","sleepEventMarker","missingData","sleep" +"11-05-2022 01:10:00","475","53","17","149.6173","0.0764","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:11:00","305","52","21","151.0414","0.1011","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:12:00","608","52","17","152.5025","0.1344","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:13:00","160","50","18","153.8994","0.0767","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:14:00","735","51","20","155.3830","0.1547","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:15:00","1345","52","19","156.8386","0.1294","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:16:00","144","55","17","158.5574","0.3664","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:17:00","243","54","19","159.9361","0.0603","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:18:00","171","53","17","161.3136","0.0592","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:19:00","63","54","17","162.6497","0.0219","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:20:00","761","55","18","164.0025","0.0369","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:21:00","1330","55","NaN","165.7321","0.3761","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:22:00","144","55","18","167.1846","0.1267","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:23:00","1669","52","17","168.7497","0.2281","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:24:00","356","52","18","170.2722","0.1897","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:25:00","122","51","19","171.6327","0.0439","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:26:00","121","50","19","172.9815","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:27:00","729","51","19","174.4491","0.1403","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:28:00","1027","51","NaN","176.0438","0.2547","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:29:00","116","49","19","177.4303","0.0672","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:30:00","101","47","16","178.7790","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:31:00","484","50","7","180.2040","0.1019","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:32:00","114","50","15","181.5673","0.0464","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:33:00","113","49","16","182.9161","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:34:00","111","48","16","184.2648","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:35:00","798","49","17","185.7552","0.1608","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 01:36:00","70","49","11","187.1309","0.0575","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:37:00","54","47","15","188.4611","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:38:00","54","48","15","189.7914","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:39:00","54","49","12","191.1216","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:40:00","58","48","8","192.4519","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:41:00","55","48","10","193.7821","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:42:00","56","49","13","195.1124","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:43:00","52","49","16","196.4426","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:44:00","51","48","11","197.7728","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:45:00","51","49","11","199.1031","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:46:00","50","47","15","200.4333","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:47:00","52","48","11","201.7636","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:48:00","80","47","13","203.0975","0.0200","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:49:00","46","47","14","204.4278","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:50:00","43","48","11","205.7580","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:51:00","44","47","12","207.0883","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:52:00","45","48","17","208.4185","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:53:00","49","48","17","209.7488","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:54:00","43","48","18","211.0790","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:55:00","45","48","17","212.4093","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:56:00","42","47","13","213.7395","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:57:00","175","47","15","215.0750","0.0214","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:58:00","46","47","12","216.4275","0.0367","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 01:59:00","43","47","15","217.7577","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:00:00","47","47","17","219.0880","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:01:00","45","47","17","220.4182","0.0167","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:02:00","45","47","17","221.7485","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:03:00","45","48","17","223.0787","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:04:00","1401","50","18","224.5367","0.1317","1","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:05:00","118","48","15","226.1046","0.2306","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:06:00","93","45","15","227.4583","0.0378","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:07:00","94","46","12","228.7889","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:08:00","93","47","13","230.1191","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:09:00","92","47","16","231.4494","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:10:00","92","47","16","232.7796","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:11:00","96","47","15","234.1099","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:12:00","104","47","14","235.4441","0.0203","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:13:00","90","47","9","236.7790","0.0208","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:14:00","89","47","16","238.1093","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:15:00","90","47","14","239.4395","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:16:00","90","48","10","240.7698","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:17:00","90","47","12","242.1000","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:18:00","102","48","16","243.4377","0.0233","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:19:00","93","47","14","244.7679","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:20:00","94","48","15","246.0981","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:21:00","97","48","16","247.4324","0.0203","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:22:00","266","47","16","248.8068","0.0564","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:23:00","116","47","15","250.1568","0.0344","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:24:00","122","47","14","251.5056","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:25:00","111","48","14","252.8543","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:26:00","102","47","12","254.1985","0.0292","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:27:00","170","48","14","255.5318","0.0194","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:28:00","96","48","16","256.8889","0.0408","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:29:00","97","48","17","258.2225","0.0197","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:30:00","94","48","6","259.5528","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:31:00","93","48","12","260.8830","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:32:00","89","48","13","262.2133","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:33:00","1318","55","11","263.8333","0.2775","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:34:00","84","44","16","265.2198","0.0672","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:35:00","87","47","16","266.5555","0.0217","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:36:00","87","46","16","267.8858","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:37:00","88","46","16","269.2161","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:38:00","329","47","16","270.5611","0.0300","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:39:00","154","52","18","271.9626","0.0808","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:40:00","84","45","15","273.3012","0.0242","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:41:00","82","45","15","274.6315","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:42:00","82","45","15","275.9617","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:43:00","85","48","15","277.2920","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:44:00","185","49","16","278.6420","0.0344","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:45:00","101","47","14","279.9917","0.0342","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:46:00","110","46","15","281.3321","0.0258","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:47:00","70","47","16","282.6624","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:48:00","88","48","17","283.9960","0.0197","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:49:00","66","45","16","285.3262","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:50:00","90","45","12","286.6574","0.0175","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:51:00","69","48","15","287.9877","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:52:00","217","48","13","289.3528","0.0481","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:53:00","81","46","16","290.6905","0.0233","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:54:00","82","47","14","292.0210","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:55:00","73","45","15","293.3513","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:56:00","1297","49","13","294.7873","0.1119","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:57:00","181","47","NaN","296.5975","0.4486","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:58:00","103","47","NaN","297.9691","0.0539","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 02:59:00","96","45","13","299.3120","0.0281","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:00:00","90","45","15","300.6423","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:01:00","90","46","16","301.9725","0.0167","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:02:00","88","45","15","303.3028","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:03:00","133","46","16","304.6392","0.0222","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:04:00","203","46","15","306.0028","0.0467","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:05:00","85","44","15","307.3500","0.0319","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:06:00","113","45","16","308.6920","0.0272","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:07:00","85","45","15","310.0222","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:08:00","266","46","15","311.3741","0.0361","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:09:00","90","45","15","312.7386","0.0475","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:10:00","94","45","16","314.0747","0.0219","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:11:00","93","46","16","315.4049","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:12:00","113","46","16","316.7358","0.0172","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:13:00","88","46","16","318.0756","0.0253","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:14:00","87","47","16","319.4059","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:15:00","86","46","16","320.7361","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:16:00","90","47","16","322.0663","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:17:00","87","46","16","323.3966","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:18:00","88","46","16","324.7268","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:19:00","89","46","16","326.0571","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:20:00","89","47","16","327.3874","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:21:00","90","47","17","328.7176","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:22:00","91","47","16","330.0479","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:23:00","90","46","16","331.3781","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:24:00","90","46","17","332.7083","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:25:00","1177","48","17","334.1222","0.0919","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:26:00","144","53","17","335.9157","0.4336","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:27:00","92","43","17","337.2830","0.0500","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:28:00","1445","56","17","339.0090","0.3728","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 03:29:00","147","43","12","340.4852","0.1481","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:30:00","111","43","6","341.8395","0.0383","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:31:00","124","44","12","343.1883","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:32:00","604","44","15","344.6550","0.1394","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:33:00","166","43","16","346.0753","0.0978","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:34:00","2625","44","14","347.6342","0.2225","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 03:35:00","77","43","16","349.3531","0.3664","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:36:00","75","43","15","350.7108","0.0414","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:37:00","78","43","15","352.0410","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:38:00","81","43","15","353.3713","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:39:00","84","44","14","354.7015","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:40:00","120","43","16","356.0435","0.0272","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:41:00","68","43","14","357.3750","0.0178","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:42:00","74","44","15","358.7053","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:43:00","91","45","16","360.0395","0.0203","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:44:00","149","43","16","361.3852","0.0306","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:45:00","58","44","15","362.7191","0.0200","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:46:00","65","44","16","364.0494","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:47:00","58","44","15","365.3796","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:48:00","408","46","15","366.7207","0.0264","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:49:00","642","52","15","368.2762","0.2194","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:50:00","61","44","16","369.6179","0.0269","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:51:00","44","44","15","370.9482","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:52:00","50","46","16","372.2784","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:53:00","56","45","16","373.6087","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:54:00","49","44","14","374.9389","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:55:00","60","46","14","376.2691","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:56:00","45","44","13","377.5994","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:57:00","48","45","16","378.9296","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:58:00","46","45","14","380.2599","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 03:59:00","45","46","15","381.5901","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:00:00","45","47","16","382.9204","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:01:00","44","45","16","384.2506","0.0167","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:02:00","47","46","16","385.5809","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:03:00","48","47","16","386.9111","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:04:00","50","47","16","388.2414","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:05:00","50","47","15","389.5716","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:06:00","49","47","16","390.9018","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:07:00","53","46","15","392.2321","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:08:00","2226","53","16","394.0695","0.4731","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 04:09:00","81","45","16","395.5053","0.1117","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:10:00","625","52","17","396.9830","0.1494","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:11:00","35","44","15","398.3238","0.0261","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:12:00","77","45","16","399.6590","0.0211","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:13:00","35","44","16","400.9892","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:14:00","37","44","17","402.3195","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:15:00","35","45","17","403.6497","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:16:00","34","45","13","404.9800","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:17:00","31","44","18","406.2951","0.0031","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:18:00","36","47","11","407.6164","0.0086","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:19:00","39","52","8","408.9466","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:20:00","47","57","10","410.2769","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 04:21:00","1198","53","15","412.2281","0.5756","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:22:00","42","42","12","413.6093","0.0625","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:23:00","47","46","8","414.9395","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:24:00","50","45","9","416.2697","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:25:00","52","47","7","417.6000","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:26:00","51","46","9","418.9303","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:27:00","74","45","15","420.2605","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:28:00","70","46","15","421.5908","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:29:00","75","45","13","422.9210","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:30:00","618","47","12","424.2883","0.0500","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:31:00","1079","53","12","425.9768","0.3392","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:32:00","67","41","10","427.3404","0.0467","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:33:00","72","43","8","428.6707","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:34:00","150","43","15","430.0198","0.0336","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:35:00","83","44","10","431.3525","0.0189","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:36:00","1078","49","15","432.8787","0.1931","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:37:00","125","45","13","434.3432","0.1375","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:38:00","94","41","14","435.6926","0.0339","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:39:00","101","41","14","437.0296","0.0228","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:40:00","98","43","14","438.3722","0.0278","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:41:00","101","42","16","439.7043","0.0183","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:42:00","104","45","16","441.0518","0.0322","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:43:00","644","44","13","442.4861","0.1103","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:44:00","93","43","15","443.8738","0.0683","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:45:00","114","46","15","445.2220","0.0328","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:46:00","83","43","12","446.5574","0.0214","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:47:00","101","44","13","447.8914","0.0200","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:48:00","199","45","11","449.2336","0.0275","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:49:00","92","43","8","450.5929","0.0428","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:50:00","1699","45","13","452.0571","0.1372","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" +"11-05-2022 04:51:00","179","47","15","453.8639","0.4456","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:52:00","62","41","16","455.2210","0.0408","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:53:00","58","42","15","456.5513","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:54:00","59","41","16","457.8815","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:55:00","78","43","16","459.2120","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:56:00","62","44","16","460.5423","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:57:00","57","41","15","461.8725","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:58:00","66","43","16","463.2028","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 04:59:00","60","45","17","464.5330","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:00:00","755","49","19","466.0179","0.1558","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:01:00","79","40","13","467.3834","0.0483","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:02:00","149","43","14","468.7364","0.0372","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:03:00","82","43","15","470.0719","0.0214","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:04:00","92","44","15","471.4022","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:05:00","88","43","12","472.7340","0.0181","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:06:00","87","46","14","474.0642","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:07:00","86","44","14","475.3944","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:08:00","164","46","15","476.7395","0.0300","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:09:00","88","43","15","478.0846","0.0300","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:10:00","129","45","12","479.4281","0.0286","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:11:00","137","43","11","480.7722","0.0292","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:12:00","130","43","12","482.1293","0.0408","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:13:00","261","43","16","483.5062","0.0586","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:14:00","95","43","11","484.8556","0.0339","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" +"11-05-2022 05:15:00","94","45","14","486.1861","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" From e452535136391d589508978919009194a8c92fb0 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 14:01:09 +0200 Subject: [PATCH 11/25] change filename default from file to NULL #68 --- R/readActiGraphCount.R | 2 +- R/readActicalCount.R | 2 +- R/readActiwatchCount.R | 2 +- man/readActiGraphCount.Rd | 2 +- man/readActicalCount.Rd | 2 +- man/readActiwatchCount.Rd | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R index f12c7b1..8a76eac 100644 --- a/R/readActiGraphCount.R +++ b/R/readActiGraphCount.R @@ -1,4 +1,4 @@ -readActiGraphCount = function(filename = file, desiredEpochSize = NULL, +readActiGraphCount = function(filename = NULL, desiredEpochSize = NULL, timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat deviceSerialNumber = NULL diff --git a/R/readActicalCount.R b/R/readActicalCount.R index 337c1e9..3fde1d3 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -1,4 +1,4 @@ -readActicalCount = function(filename = file, desiredEpochSize = NULL, +readActicalCount = function(filename = NULL, desiredEpochSize = NULL, timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index 53fe822..4db376a 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -1,4 +1,4 @@ -readActiwatchCount = function(filename = file, desiredEpochSize = NULL, +readActiwatchCount = function(filename = NULL, desiredEpochSize = NULL, timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat diff --git a/man/readActiGraphCount.Rd b/man/readActiGraphCount.Rd index 9b8df2e..6fda63f 100644 --- a/man/readActiGraphCount.Rd +++ b/man/readActiGraphCount.Rd @@ -7,7 +7,7 @@ Reads ActiGraph Count data file. Currently a variety of csv format are facilitated. } \usage{ - readActiGraphCount(filename = file, desiredEpochSize = NULL, + readActiGraphCount(filename = NULL, desiredEpochSize = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", timeformatName = "timeformat") } diff --git a/man/readActicalCount.Rd b/man/readActicalCount.Rd index f220b5f..c31e8c2 100644 --- a/man/readActicalCount.Rd +++ b/man/readActicalCount.Rd @@ -7,7 +7,7 @@ Reads Actical Count data file. } \usage{ - readActicalCount(filename = file, desiredEpochSize = NULL, + readActicalCount(filename = NULL, desiredEpochSize = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", timeformatName = "timeformat") } diff --git a/man/readActiwatchCount.Rd b/man/readActiwatchCount.Rd index ace96b9..de33573 100644 --- a/man/readActiwatchCount.Rd +++ b/man/readActiwatchCount.Rd @@ -7,7 +7,7 @@ Reads Actiwatch Count data file. Currently a variety of csv format are facilitated. } \usage{ - readActiwatchCount(filename = file, desiredEpochSize = NULL, + readActiwatchCount(filename = NULL, desiredEpochSize = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", timeformatName = "timeformat") } From 207d712ae4ef53b10946dd9eccbd5aa295eaad9e Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 27 Sep 2024 17:30:25 +0200 Subject: [PATCH 12/25] add Fitbit json read functionalty #68 --- DESCRIPTION | 2 +- NEWS.md | 2 +- R/readFitbit.R | 85 ++++++++ README.md | 4 +- .../testfiles/calories-1995-06-23_Fitbit.json | 142 +++++++++++++ inst/testfiles/sleep-1995-06-23_Fitbit.json | 200 ++++++++++++++++++ inst/testfiles/steps-1995-06-23_Fitbit.json | 103 +++++++++ man/readFitbit.Rd | 22 ++ tests/testthat/test_readFitbit.R | 29 +++ 9 files changed, 586 insertions(+), 3 deletions(-) create mode 100644 R/readFitbit.R create mode 100644 inst/testfiles/calories-1995-06-23_Fitbit.json create mode 100644 inst/testfiles/sleep-1995-06-23_Fitbit.json create mode 100644 inst/testfiles/steps-1995-06-23_Fitbit.json create mode 100644 man/readFitbit.Rd create mode 100644 tests/testthat/test_readFitbit.R diff --git a/DESCRIPTION b/DESCRIPTION index 2bfb8d6..d339294 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,7 +22,7 @@ URL: https://github.com/wadpac/GGIRread/ BugReports: https://github.com/wadpac/GGIRread/issues License: Apache License (== 2.0) Suggests: testthat -Imports: matlab, bitops, Rcpp (>= 0.12.10), data.table, readxl +Imports: matlab, bitops, Rcpp (>= 0.12.10), data.table, readxl, jsonlite Depends: stats, utils, R (>= 3.5.0) NeedsCompilation: yes LinkingTo: Rcpp diff --git a/NEWS.md b/NEWS.md index 1d6a235..2719601 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,7 +5,7 @@ - Migrate read function for ActiGraph (csv) and Actiwatch (csv/awd) count data to GGIRread #68. - Add function for reading Actical (csv) count data #68. - Add function to read and merge Philips Health Band file pairs (xlsx) #68. - +- Add function for reading Fitbit (json) with sleep, steps or calories #68. # Changes in version 1.0.1 (release date:03-06-2024) diff --git a/R/readFitbit.R b/R/readFitbit.R new file mode 100644 index 0000000..99f440b --- /dev/null +++ b/R/readFitbit.R @@ -0,0 +1,85 @@ +readFitbit = function(filename = NULL) { + # Assumptions made: + # - sleep is sampled at 30 second resolution + # - steps are sampled at 60 second resolution + # - timestamp format is always the same per data type + + # Declare local functions + handleTimeGaps = function(df, epochSize) { + timeRange = range(df$dateTime) + startTime = timeRange[1] + endTime = timeRange[2] + timeFrame = data.frame(dateTime = seq(startTime, endTime, by = epochSize)) + df = merge(df, timeFrame, by = c("dateTime"), all.x = TRUE) + return(df) + } + + #------------------------------------------------- + # Main code + + D = jsonlite::read_json(path = filename, + simplifyVector = FALSE, + flatten = FALSE) + + # extract dataType as json structure differs between types + dataType = tolower(unlist(strsplit(basename(filename), "-"))[1]) + + if (dataType == "sleep") { + epochSize = 30 + # Put all data in data.frame + for (i in 1:length(D)) { + tmp = D[[i]][15]$levels + data = as.data.frame(data.table::rbindlist(tmp$data, fill = TRUE)) + data$dateTime = as.POSIXct(data$dateTime, format = "%Y-%m-%dT%H:%M:%S") + if (i == 1) { + all_data = data + } else { + all_data = rbind(all_data, data) + } + if ("shortData" %in% names(tmp)) { + shortData = data.table::rbindlist(tmp$shortData, fill = TRUE) + shortData$dateTime = as.POSIXct(shortData$dateTime, format = "%Y-%m-%dT%H:%M:%S") + if (i == 1) { + all_shortData = shortData + } else { + all_shortData = rbind(all_shortData, shortData) + } + } + } + # Expand to full time series + D = as.data.frame(lapply(all_data, rep, all_data$seconds/epochSize)) + D$dateTime = seq(from = D$dateTime[1], length.out = nrow(D), by = epochSize) + D$seconds = epochSize + D = handleTimeGaps(D, epochSize) # Handle time gaps, if any + + S = as.data.frame(lapply(all_shortData, rep, all_shortData$seconds/30)) + S$dateTime = seq(from = S$dateTime[1], length.out = nrow(S), by = 30) + S$seconds = epochSize + + # merge in shortData (S) + matching_times = which(S$dateTime %in% D$dateTime == TRUE) + non_matching_times = which(S$dateTime %in% D$dateTime == FALSE) + if (length(matching_times) > 0) { + times_to_replace = S$dateTime[matching_times] + D[which(D$dateTime %in% times_to_replace), ] = S[matching_times,] + } + if (length(non_matching_times) > 0) { + D = rbind(D, S[non_matching_times,]) + } + D = handleTimeGaps(D, epochSize) # Handle new time gaps, if any + + # Order time stamps + D = D[order(D$dateTime), ] + colnames(D)[2] = "sleeplevel" + } else if (dataType == "steps" || dataType == "calories") { + epochSize = 60 + data = as.data.frame(data.table::rbindlist(D, fill = TRUE)) + data$dateTime = as.POSIXct(data$dateTime, format = "%m/%d/%y %H:%M:%S") + D = handleTimeGaps(data, epochSize = 60) + D$value = as.numeric(D$value) + colnames(D)[2] = dataType + } else { + stop("File type not recognised") + } + return(D) +} \ No newline at end of file diff --git a/README.md b/README.md index 915fd8c..8cc1940 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,6 @@ ActivInsights Ltd https://activinsights.com/ | GENEActiv Original and Sleep | .b Unilever Discover Ltd | Genea (no longer manufactured) | .bin | raw gravitational units | readGenea ActiGraph | ??? | .csv | count data | readActigraph Actiwatch | ??? | .csv and .awd | count data | readActiwatch -Actical | ??? | .csv | count data | readActical \ No newline at end of file +Actical | ??? | .csv | count data | readActical.R +Philips Health Band | ??? | .xlsx | count data | mergePHBfilePairs.R +Fitbit | ??? | .json | sleep, steps or calories data | readFitbit.R diff --git a/inst/testfiles/calories-1995-06-23_Fitbit.json b/inst/testfiles/calories-1995-06-23_Fitbit.json new file mode 100644 index 0000000..81f1294 --- /dev/null +++ b/inst/testfiles/calories-1995-06-23_Fitbit.json @@ -0,0 +1,142 @@ +[{ + "dateTime" : "06/23/95 00:00:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:01:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:02:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:03:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:04:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:05:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:06:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:07:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:08:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:09:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:10:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:11:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:12:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:13:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:14:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:15:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:16:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:17:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:18:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:19:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:20:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:21:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:22:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:23:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:24:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:25:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:26:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:27:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:28:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:29:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:30:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:31:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:32:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:33:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:34:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:35:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:36:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:37:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:38:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:39:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:40:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:41:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:42:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:43:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:44:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:45:00", + "value" : "1.48" +},{ + "dateTime" : "06/23/95 00:46:00", + "value" : "1.48" +}] \ No newline at end of file diff --git a/inst/testfiles/sleep-1995-06-23_Fitbit.json b/inst/testfiles/sleep-1995-06-23_Fitbit.json new file mode 100644 index 0000000..e9ba306 --- /dev/null +++ b/inst/testfiles/sleep-1995-06-23_Fitbit.json @@ -0,0 +1,200 @@ +[{ + "logId" : 12345, + "dateOfSleep" : "1995-07-11", + "startTime" : "1995-07-11T02:28:30.000", + "endTime" : "1995-07-11T06:57:00.000", + "duration" : 16080000, + "minutesToFallAsleep" : 0, + "minutesAsleep" : 236, + "minutesAwake" : 32, + "minutesAfterWakeup" : 0, + "timeInBed" : 268, + "efficiency" : 96, + "type" : "stages", + "infoCode" : 0, + "logType" : "auto_detected", + "levels" : { + "summary" : { + "deep" : { + "count" : 4, + "minutes" : 59, + "thirtyDayAvgMinutes" : 45 + }, + "wake" : { + "count" : 11, + "minutes" : 32, + "thirtyDayAvgMinutes" : 45 + }, + "light" : { + "count" : 14, + "minutes" : 143, + "thirtyDayAvgMinutes" : 213 + }, + "rem" : { + "count" : 4, + "minutes" : 34, + "thirtyDayAvgMinutes" : 64 + } + }, + "data" : [{ + "dateTime" : "1995-07-11T02:28:30.000", + "level" : "light", + "seconds" : 2160 + },{ + "dateTime" : "1995-07-11T03:04:30.000", + "level" : "deep", + "seconds" : 300 + },{ + "dateTime" : "1995-07-11T03:09:30.000", + "level" : "light", + "seconds" : 450 + },{ + "dateTime" : "1995-07-11T03:17:00.000", + "level" : "deep", + "seconds" : 1080 + },{ + "dateTime" : "1995-07-11T03:35:00.000", + "level" : "light", + "seconds" : 240 + },{ + "dateTime" : "1995-07-11T03:39:00.000", + "level" : "deep", + "seconds" : 1830 + },{ + "dateTime" : "1995-07-11T04:09:30.000", + "level" : "light", + "seconds" : 2670 + },{ + "dateTime" : "1995-07-11T04:54:00.000", + "level" : "deep", + "seconds" : 390 + },{ + "dateTime" : "1995-07-11T05:00:30.000", + "level" : "light", + "seconds" : 750 + },{ + "dateTime" : "1995-07-11T05:13:00.000", + "level" : "rem", + "seconds" : 270 + },{ + "dateTime" : "1995-07-11T05:17:30.000", + "level" : "light", + "seconds" : 1050 + },{ + "dateTime" : "1995-07-11T05:35:00.000", + "level" : "wake", + "seconds" : 600 + },{ + "dateTime" : "1995-07-11T05:45:00.000", + "level" : "light", + "seconds" : 240 + },{ + "dateTime" : "1995-07-11T05:49:00.000", + "level" : "wake", + "seconds" : 660 + },{ + "dateTime" : "1995-07-11T06:00:00.000", + "level" : "light", + "seconds" : 930 + },{ + "dateTime" : "1995-07-11T06:15:30.000", + "level" : "rem", + "seconds" : 300 + },{ + "dateTime" : "1995-07-11T06:20:30.000", + "level" : "light", + "seconds" : 630 + },{ + "dateTime" : "1995-07-11T06:31:00.000", + "level" : "rem", + "seconds" : 1560 + }], + "shortData" : [{ + "dateTime" : "1995-07-11T04:08:30.000", + "level" : "wake", + "seconds" : 60 + },{ + "dateTime" : "1995-07-11T04:15:30.000", + "level" : "wake", + "seconds" : 150 + },{ + "dateTime" : "1995-07-11T04:33:30.000", + "level" : "wake", + "seconds" : 60 + },{ + "dateTime" : "1995-07-11T05:00:30.000", + "level" : "wake", + "seconds" : 60 + },{ + "dateTime" : "1995-07-11T06:13:30.000", + "level" : "wake", + "seconds" : 90 + },{ + "dateTime" : "1995-07-11T06:22:30.000", + "level" : "wake", + "seconds" : 90 + },{ + "dateTime" : "1995-07-11T06:26:00.000", + "level" : "wake", + "seconds" : 120 + },{ + "dateTime" : "1995-07-11T06:33:30.000", + "level" : "wake", + "seconds" : 30 + },{ + "dateTime" : "1995-07-11T06:56:30.000", + "level" : "wake", + "seconds" : 30 + }] + }, + "mainSleep" : true +},{ + "logId" : 12345, + "dateOfSleep" : "1995-06-25", + "startTime" : "1995-06-24T22:47:30.000", + "endTime" : "1995-06-25T00:06:30.000", + "duration" : 4740000, + "minutesToFallAsleep" : 0, + "minutesAsleep" : 73, + "minutesAwake" : 6, + "minutesAfterWakeup" : 0, + "timeInBed" : 79, + "efficiency" : 92, + "type" : "classic", + "infoCode" : 2, + "logType" : "auto_detected", + "levels" : { + "summary" : { + "restless" : { + "count" : 1, + "minutes" : 5 + }, + "awake" : { + "count" : 1, + "minutes" : 1 + }, + "asleep" : { + "count" : 0, + "minutes" : 73 + } + }, + "data" : [{ + "dateTime" : "1995-06-24T22:47:30.000", + "level" : "asleep", + "seconds" : 60 + },{ + "dateTime" : "1995-06-24T22:48:30.000", + "level" : "restless", + "seconds" : 300 + },{ + "dateTime" : "1995-06-24T22:53:30.000", + "level" : "awake", + "seconds" : 60 + },{ + "dateTime" : "1995-06-24T22:54:30.000", + "level" : "asleep", + "seconds" : 4320 + }] + }, + "mainSleep" : false +}] \ No newline at end of file diff --git a/inst/testfiles/steps-1995-06-23_Fitbit.json b/inst/testfiles/steps-1995-06-23_Fitbit.json new file mode 100644 index 0000000..e9785f8 --- /dev/null +++ b/inst/testfiles/steps-1995-06-23_Fitbit.json @@ -0,0 +1,103 @@ +[{ + "dateTime" : "06/24/95 16:00:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:01:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:02:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:03:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:04:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:06:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:08:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:09:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:10:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:11:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:12:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:13:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:14:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:15:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:16:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:17:00", + "value" : "7" +},{ + "dateTime" : "06/24/95 16:18:00", + "value" : "44" +},{ + "dateTime" : "06/24/95 16:19:00", + "value" : "12" +},{ + "dateTime" : "06/24/95 16:20:00", + "value" : "58" +},{ + "dateTime" : "06/24/95 16:21:00", + "value" : "79" +},{ + "dateTime" : "06/24/95 16:22:00", + "value" : "95" +},{ + "dateTime" : "06/24/95 16:23:00", + "value" : "98" +},{ + "dateTime" : "06/24/95 16:24:00", + "value" : "102" +},{ + "dateTime" : "06/24/95 16:25:00", + "value" : "90" +},{ + "dateTime" : "06/24/95 16:26:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:27:00", + "value" : "22" +},{ + "dateTime" : "06/24/95 16:28:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:29:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:30:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:31:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:32:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:33:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:34:00", + "value" : "0" +},{ + "dateTime" : "06/24/95 16:35:00", + "value" : "0" +}] \ No newline at end of file diff --git a/man/readFitbit.Rd b/man/readFitbit.Rd new file mode 100644 index 0000000..8d5a323 --- /dev/null +++ b/man/readFitbit.Rd @@ -0,0 +1,22 @@ +\name{readFitbit} +\alias{readFitbit} +\title{ + Read Fitbit data files (json) +} +\description{ + Reads Fitbit data file (json) with sleep, steps or calories. +} +\usage{ + readFitbit(filename = NULL) +} +\arguments{ + \item{filename}{ + Character, filename (required) of json file + } +} +\value{ + Data.frame with data converted to time series +} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/tests/testthat/test_readFitbit.R b/tests/testthat/test_readFitbit.R new file mode 100644 index 0000000..eff3235 --- /dev/null +++ b/tests/testthat/test_readFitbit.R @@ -0,0 +1,29 @@ +library(GGIRread) +context("read Fitbit json") +test_that("Fitbit json is correctly read", { + # Sleep + file = system.file("testfiles/sleep-1995-06-23_Fitbit.json", package = "GGIRread") + D = readFitbit(filename = file) + expect_equal(nrow(D), 695) + expect_equal(ncol(D), 3) + expect_equal(format(D$dateTime[1]), "1995-07-11 02:28:30") + TB = table(D$sleeplevel) + expect_equal(names(TB), c("asleep", "awake", "deep", "light", "rem", "restless", "wake")) + expect_equal(as.numeric(TB), c(146, 2, 118, 283, 71, 10, 65)) + + # Steps + file = system.file("testfiles/steps-1995-06-23_Fitbit.json", package = "GGIRread") + D = readFitbit(filename = file) + expect_equal(nrow(D), 34) + expect_equal(ncol(D), 2) + expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") + expect_equal(sum(D$steps), 607) + + # Calories + file = system.file("testfiles/calories-1995-06-23_Fitbit.json", package = "GGIRread") + D = readFitbit(filename = file) + expect_equal(nrow(D), 47) + expect_equal(ncol(D), 2) + expect_equal(format(D$dateTime[1]), "1995-06-23") + expect_equal(sum(D$calories), 69.56) +}) \ No newline at end of file From 32f446081c237e559656d4c46a0dadb5fbdfd7f6 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Sat, 28 Sep 2024 09:57:00 +0200 Subject: [PATCH 13/25] remove count aggregation (will do it in GGIR) and by that simplify read functionality #68, --- R/readActiGraphCount.R | 15 ++------- R/readActicalCount.R | 13 ++------ R/readActiwatchCount.R | 14 ++------- R/utils_for_countdata.R | 30 +----------------- man/readActiGraphCount.Rd | 6 +--- man/readActicalCount.Rd | 6 +--- man/readActiwatchCount.Rd | 6 +--- tests/testthat/test_readActiGraphCount.R | 39 ++---------------------- tests/testthat/test_readActicalCount.R | 15 +-------- tests/testthat/test_readActiwatchCount.R | 30 ++---------------- 10 files changed, 17 insertions(+), 157 deletions(-) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R index 8a76eac..5045a03 100644 --- a/R/readActiGraphCount.R +++ b/R/readActiGraphCount.R @@ -1,4 +1,4 @@ -readActiGraphCount = function(filename = NULL, desiredEpochSize = NULL, +readActiGraphCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat deviceSerialNumber = NULL @@ -168,18 +168,7 @@ readActiGraphCount = function(filename = NULL, desiredEpochSize = NULL, checkTimeFormat(timestamp_POSIX = timestamp_POSIX, rawValue = timestamp[1], timeformat = timeformat, timeformatName = timeformatName) - - - # If requested, aggregate data to lower resolution to match desired - # epoch size in argument windowsizes - if (!is.null(desiredEpochSize)) { - if (desiredEpochSize > epSizeShort) { - step = desiredEpochSize %/% epSizeShort - D = matAggregate(D, step) - epSizeShort = epSizeShort * step - } - checkEpochMatch(desiredEpochSize, epSizeShort) - } + invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX, deviceSerialNumber = deviceSerialNumber)) diff --git a/R/readActicalCount.R b/R/readActicalCount.R index 3fde1d3..86dbf10 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -1,4 +1,4 @@ -readActicalCount = function(filename = NULL, desiredEpochSize = NULL, +readActicalCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat @@ -51,16 +51,7 @@ readActicalCount = function(filename = NULL, desiredEpochSize = NULL, D = D[, -which(colnames(D) %in% c("date", "time"))] D = as.matrix(D, drop = FALSE) if (quote == "") D = apply(D, 2, as.numeric) - # If requested, aggregate data to lower resolution to match desired - # epoch size in argument windowsizes - if (!is.null(desiredEpochSize)) { - if (desiredEpochSize > epSizeShort) { - step = desiredEpochSize %/% epSizeShort - D = matAggregate(D, step) - epSizeShort = epSizeShort * step - } - checkEpochMatch(desiredEpochSize, epSizeShort) - } + invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX)) } \ No newline at end of file diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index 4db376a..c581174 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -1,4 +1,4 @@ -readActiwatchCount = function(filename = NULL, desiredEpochSize = NULL, +readActiwatchCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat @@ -86,17 +86,7 @@ readActiwatchCount = function(filename = NULL, desiredEpochSize = NULL, } D = as.matrix(D, drop = FALSE) - if (quote == "") D = apply(D, 2, as.numeric) - # If requested, aggregate data to lower resolution to match desired - # epoch size in argument windowsizes - if (!is.null(desiredEpochSize)) { - if (desiredEpochSize > epSizeShort) { - step = desiredEpochSize %/% epSizeShort - D = matAggregate(D, step) - epSizeShort = epSizeShort * step - } - checkEpochMatch(desiredEpochSize, epSizeShort) - } + if (quote == "") D = apply(D, 2, as.numeric) invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX)) } \ No newline at end of file diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R index 61773c4..ff471b1 100644 --- a/R/utils_for_countdata.R +++ b/R/utils_for_countdata.R @@ -25,17 +25,6 @@ checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? } } -checkEpochMatch = function(desiredEpochSize, epSizeShort) { - # Check whether desired and derived epoch size match - if (!is.null(desiredEpochSize) && epSizeShort != desiredEpochSize) { - stop(paste0("\nThe short epoch size as specified by the user (", - desiredEpochSize, " seconds) does NOT match the short", - " epoch size we see in the data (", epSizeShort, - " seconds). Please correct."), call. = FALSE) - } - return() -} - detectQuote = function(fn, index) { # data.table::fread has argument quote. # On some computers the quotes in the files are @@ -62,24 +51,7 @@ getExtension <- function(filename){ return(ex[-1]) } -matAggregate = function(mat, step) { - # Aggregate matrix mat by taking over step number of rows - # as sum unless column names is sleep or nonwear in that case - # we take the rounded mean. - mat = rbind(rep(0, ncol(mat)), mat) - cumsum2 = function(x) { - x = cumsum(ifelse(is.na(x), 0, x)) + x*0 - return(x) - } - mat = apply(mat, 2, cumsum2) - mat = mat[seq(1, nrow(mat), by = step), , drop = FALSE] - mat = apply(mat, 2, diff) - # Correct non incremental variables - for (niv in c("sleep", "nonwear")) { - if (niv %in% colnames(D)) D[, niv] = round(D[, niv] / step) - } - return(mat) -} + findStartData = function(filename, quote, startindex) { # Function used to find start of time series in Actiwatch and Actical data diff --git a/man/readActiGraphCount.Rd b/man/readActiGraphCount.Rd index 6fda63f..2663086 100644 --- a/man/readActiGraphCount.Rd +++ b/man/readActiGraphCount.Rd @@ -7,7 +7,7 @@ Reads ActiGraph Count data file. Currently a variety of csv format are facilitated. } \usage{ - readActiGraphCount(filename = NULL, desiredEpochSize = NULL, + readActiGraphCount(filename = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", timeformatName = "timeformat") } @@ -15,10 +15,6 @@ \item{filename}{ filename (required) } - \item{desiredEpochSize}{ - Numeric, desired epoch size in seconds. If set aggregate data by summation to - this epochsize. - } \item{timeformat}{ Character, timestemp format. } diff --git a/man/readActicalCount.Rd b/man/readActicalCount.Rd index c31e8c2..f8650eb 100644 --- a/man/readActicalCount.Rd +++ b/man/readActicalCount.Rd @@ -7,7 +7,7 @@ Reads Actical Count data file. } \usage{ - readActicalCount(filename = NULL, desiredEpochSize = NULL, + readActicalCount(filename = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", timeformatName = "timeformat") } @@ -15,10 +15,6 @@ \item{filename}{ filename (required) } - \item{desiredEpochSize}{ - Numeric, desired epoch size in seconds. If set aggregate data by summation to - this epochsize. - } \item{timeformat}{ Character, timestemp format. } diff --git a/man/readActiwatchCount.Rd b/man/readActiwatchCount.Rd index de33573..67f58b6 100644 --- a/man/readActiwatchCount.Rd +++ b/man/readActiwatchCount.Rd @@ -7,7 +7,7 @@ Reads Actiwatch Count data file. Currently a variety of csv format are facilitated. } \usage{ - readActiwatchCount(filename = NULL, desiredEpochSize = NULL, + readActiwatchCount(filename = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", timeformatName = "timeformat") } @@ -15,10 +15,6 @@ \item{filename}{ filename (required) } - \item{desiredEpochSize}{ - Numeric, desired epoch size in seconds. If set aggregate data by summation to - this epochsize. - } \item{timeformat}{ Character, timestemp format. } diff --git a/tests/testthat/test_readActiGraphCount.R b/tests/testthat/test_readActiGraphCount.R index 73772a1..fea1b90 100644 --- a/tests/testthat/test_readActiGraphCount.R +++ b/tests/testthat/test_readActiGraphCount.R @@ -2,16 +2,7 @@ library(GGIRread) context("read ActiGraph csv files") test_that("ActiGraph61 is correctly read", { file = system.file("testfiles/ActiGraph61.csv", package = "GGIRread") - D = readActiGraphCount(filename = file, desiredEpochSize = 10, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") - expect_equal(D$deviceSerialNumber, "MOS2D16160581") - expect_equal(D$epochSize, 10) - expect_equal(format(D$startTime), "2016-08-15 21:35:00") - expect_equal(nrow(D$data), 495) - expect_equal(ncol(D$data), 5) - expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 63952.33) - expect_equal(sum(D$data[, c("steps")]), 253) - - D = readActiGraphCount(filename = file, desiredEpochSize = 5, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") expect_equal(D$deviceSerialNumber, "MOS2D16160581") expect_equal(D$epochSize, 5) expect_equal(format(D$startTime), "2016-08-15 21:35:00") @@ -23,7 +14,7 @@ test_that("ActiGraph61 is correctly read", { test_that("ActiGraph31 is correctly read", { file = system.file("testfiles/ActiGraph13.csv", package = "GGIRread") - D = readActiGraphCount(filename = file, desiredEpochSize = 15, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") expect_equal(D$deviceSerialNumber, "CLE2A2123456") expect_equal(D$epochSize, 15) expect_equal(format(D$startTime), "2013-08-26 09:00:00") @@ -31,21 +22,11 @@ test_that("ActiGraph31 is correctly read", { expect_equal(ncol(D$data), 5) expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 272870.6, tol = 0.1) expect_equal(sum(D$data[, c("steps")]), 1118) - - D = readActiGraphCount(filename = file, desiredEpochSize = 30, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") - expect_equal(D$deviceSerialNumber, "CLE2A2123456") - expect_equal(D$epochSize, 30) - expect_equal(format(D$startTime), "2013-08-26 09:00:00") - expect_equal(nrow(D$data), 495) - expect_equal(ncol(D$data), 5) - expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 272870.6, tol = 0.1) - expect_equal(sum(D$data[, c("steps")]), 1118) - }) test_that("ActiGraph13_timestamps_headers.csv is correctly read", { file = system.file("testfiles/ActiGraph13_timestamps_headers.csv", package = "GGIRread") - D = readActiGraphCount(filename = file, desiredEpochSize = 1, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") + D = readActiGraphCount(filename = file, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") expect_equal(D$deviceSerialNumber, "TAS1D48140206") expect_equal(D$epochSize, 1) expect_equal(format(D$startTime), "2017-12-09 15:00:00") @@ -53,25 +34,11 @@ test_that("ActiGraph13_timestamps_headers.csv is correctly read", { expect_equal(ncol(D$data), 5) expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 255707.4, tol = 0.1) expect_equal(sum(D$data[, c("steps")]), 442) - - D = readActiGraphCount(filename = file, desiredEpochSize = 5, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") - expect_equal(D$deviceSerialNumber, "TAS1D48140206") - expect_equal(D$epochSize, 5) - expect_equal(format(D$startTime), "2017-12-09 15:00:00") - expect_equal(nrow(D$data), 200) - expect_equal(ncol(D$data), 5) - expect_equal(sum(D$data[, c("y", "x", "z", "vm")]), 255707.4, tol = 0.1) - expect_equal(sum(D$data[, c("steps")]), 442) }) test_that("Actiwatch csv error correctly", { file = system.file("testfiles/ActiGraph13_timestamps_headers.csv", package = "GGIRread") expect_error(readActiGraphCount(filename = file, - desiredEpochSize = 5, timeformat = "%m/%d/%Y %H:%M:%S"), regexp = "Time format*") - expect_error(readActiGraphCount(filename = file, - desiredEpochSize = 0.5, - timeformat = "%d-%m-%Y %H:%M:%S"), - regexp = "The short*") }) \ No newline at end of file diff --git a/tests/testthat/test_readActicalCount.R b/tests/testthat/test_readActicalCount.R index 626a606..033b5b5 100644 --- a/tests/testthat/test_readActicalCount.R +++ b/tests/testthat/test_readActicalCount.R @@ -2,30 +2,17 @@ library(GGIRread) context("read Actical files") test_that("Actical csv is correctly read", { file = system.file("testfiles/Actical.csv", package = "GGIRread") - D = readActicalCount(filename = file, desiredEpochSize = 60, timeformat = "%d-%b-%y %H:%M", tz = "") + D = readActicalCount(filename = file, timeformat = "%d-%b-%y %H:%M", tz = "") expect_equal(D$epochSize, 60) expect_equal(format(D$startTime), "2021-05-13") expect_equal(nrow(D$data), 501) expect_equal(ncol(D$data), 2) expect_equal(sum(D$data, na.rm = TRUE), 8436) - - D = readActicalCount(filename = file, desiredEpochSize = 120, timeformat = "%d-%b-%y %H:%M", tz = "") - expect_equal(D$epochSize, 120) - expect_equal(format(D$startTime), "2021-05-13") - expect_equal(nrow(D$data), 250) - expect_equal(ncol(D$data), 2) - expect_equal(sum(D$data, na.rm = TRUE), 8436) }) test_that("Actical csv error correctly", { file = system.file("testfiles/Actical.csv", package = "GGIRread") expect_error(readActicalCount(filename = file, - desiredEpochSize = 60, timeformat = "%d/%m/%Y %H:%M", tz = ""), regexp = "Time format*") - - expect_error(readActicalCount(filename = file, - desiredEpochSize = 5, - timeformat = "%d-%b-%y %H:%M", tz = ""), - regexp = "The short*") }) \ No newline at end of file diff --git a/tests/testthat/test_readActiwatchCount.R b/tests/testthat/test_readActiwatchCount.R index 23e76c0..69a6235 100644 --- a/tests/testthat/test_readActiwatchCount.R +++ b/tests/testthat/test_readActiwatchCount.R @@ -2,7 +2,7 @@ library(GGIRread) context("read Actiwatch files") test_that("Actiwatch csv is correctly read", { file = system.file("testfiles/Actiwatch.csv", package = "GGIRread") - D = readActiwatchCount(filename = file, desiredEpochSize = 15, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") + D = readActiwatchCount(filename = file, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") expect_equal(D$epochSize, 15) expect_equal(format(D$startTime), "2019-11-23 06:00:00") expect_equal(nrow(D$data), 860) @@ -10,55 +10,31 @@ test_that("Actiwatch csv is correctly read", { expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 4589) expect_equal(sum(D$data[, "sleep"], na.rm = TRUE), 55) expect_equal(sum(D$data[, "nonwear"], na.rm = TRUE), 797) - - D = readActiwatchCount(filename = file, desiredEpochSize = 30, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") - expect_equal(D$epochSize, 30) - expect_equal(format(D$startTime), "2019-11-23 06:00:00") - expect_equal(nrow(D$data), 430) - expect_equal(ncol(D$data), 3) - expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 4569) - expect_equal(sum(D$data[, "sleep"], na.rm = TRUE), 54) - expect_equal(sum(D$data[, "nonwear"], na.rm = TRUE), 797) }) test_that("Actiwatch awd is correctly read", { file = system.file("testfiles/Actiwatch.AWD", package = "GGIRread") - D = readActiwatchCount(filename = file, desiredEpochSize = 60, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") + D = readActiwatchCount(filename = file, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") expect_equal(D$epochSize, 60) expect_equal(format(D$startTime), "2009-10-01 17:00:00") expect_equal(nrow(D$data), 329) expect_equal(ncol(D$data), 2) expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 108864) expect_equal(sum(D$data[, "light"], na.rm = TRUE), 0) - - D = readActiwatchCount(filename = file, desiredEpochSize = 300, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") - expect_equal(D$epochSize, 300) - expect_equal(format(D$startTime), "2009-10-01 17:00:00") - expect_equal(nrow(D$data), 65) - expect_equal(ncol(D$data), 2) - expect_equal(sum(D$data[, "counts"], na.rm = TRUE), 108713) - expect_equal(sum(D$data[, "light"], na.rm = TRUE), 0) }) test_that("Actiwatch awd error correctly", { file = system.file("testfiles/Actiwatch.AWD", package = "GGIRread") expect_error(readActiwatchCount(filename = file, - desiredEpochSize = 60, timeformat = "%d-%m-%Y %H:%M:%S"), regexp = "Time format*") - expect_error(readActiwatchCount(filename = file, - desiredEpochSize = 5, - timeformat = "%d-%b-%Y %H:%M:%S"), - regexp = "The short*") - expect_error(readActiwatchCount(filename = "", - desiredEpochSize = 60, timeformat = "%d-%b-%Y %H:%M:%S"), regexp = "Cannot") }) -test_that("checkTimeFormat also detect implausible year", { +test_that("checkTimeFormat also detects implausible year", { rawValue = "6/28/21 10:10:10" timeformat = "%m/%d/%y %H:%M:%S" timestamp_POSIX = as.POSIXlt("6/28/21 10:10:10", format = "%m/%d/%Y %H:%M:%S") From 2ceb92ccaf7a5073946a4180c84a0fb4a2ae314f Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Mon, 30 Sep 2024 11:09:28 +0200 Subject: [PATCH 14/25] add arguments to control timezone #68 --- R/mergePHBfilePairs.R | 45 +++++++++------------- R/readActiGraphCount.R | 17 ++++++-- R/readActicalCount.R | 15 ++++++-- R/readActiwatchCount.R | 15 ++++++-- R/readFitbit.R | 16 +++++--- R/readPHBCount.R | 43 +++++++++++++++++++++ man/mergePHBfilePairs.Rd | 23 ++++++++++- man/readActiGraphCount.Rd | 17 ++++++-- man/readActicalCount.Rd | 15 ++++++-- man/readActiwatchCount.Rd | 15 ++++++-- man/readFitbit.Rd | 13 ++++++- man/readPHBCount.Rd | 43 +++++++++++++++++++++ tests/testthat/test_mergePHBfilePairs.R | 6 ++- tests/testthat/test_readActiGraphCount.R | 29 ++++++++++++-- tests/testthat/test_readActicalCount.R | 27 +++++++++++-- tests/testthat/test_readActiwatchCount.R | 24 +++++++++++- tests/testthat/test_readFitbit.R | 24 ++++++++++-- tests/testthat/test_readPHBCount.R | 49 ++++++++++++++++++++++++ 18 files changed, 367 insertions(+), 69 deletions(-) create mode 100644 R/readPHBCount.R create mode 100644 man/readPHBCount.Rd create mode 100644 tests/testthat/test_readPHBCount.R diff --git a/R/mergePHBfilePairs.R b/R/mergePHBfilePairs.R index 8f8f3a3..6281b8f 100644 --- a/R/mergePHBfilePairs.R +++ b/R/mergePHBfilePairs.R @@ -1,10 +1,11 @@ -mergePHBfilePairs = function(inputPath = ".", outputPath = ".") { +mergePHBfilePairs = function(inputPath = ".", outputPath = ".", + timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "", configtz = NULL, + timeformatName = "timeformat") { # merges Philips Health Band xlsx files per participant # as there can be multiple files per participant. - fnames = dir(inputPath, recursive = FALSE, full.names = TRUE, pattern = "[.]xlsx") fileOverview = data.frame(filename = fnames) - extractID = function(x) { x = basename(x) x = gsub(pattern = "sleep_wake", replacement = "sleepwake", x = tolower(x)) @@ -23,41 +24,31 @@ mergePHBfilePairs = function(inputPath = ".", outputPath = ".") { next } # Data + deviceSN = NULL if (length(file1) > 0) { - data1 = as.data.frame(readxl::read_excel(path = filesForThisPerson[file1], - col_types = "text", skip = 8), - row.names = FALSE) - header = as.data.frame(readxl::read_excel(path = filesForThisPerson[file1], - col_types = "text", n_max = 8, - .name_repair = "unique_quiet"), - row.names = FALSE)[, 1] - SNlocation = grep(pattern = "deviceSN", x = header) - if (length(SNlocation) > 0) { - deviceSN = unlist(strsplit(header[grep(pattern = "deviceSN", x = header)], " ")) - deviceSN = deviceSN[length(deviceSN)] - } else { - deviceSN = NULL - } - colnames(data1)[grep(pattern = "counts", x = colnames(data1), ignore.case = TRUE)] = "counts" - colnames(data1)[grep(pattern = "offWrist", x = colnames(data1), ignore.case = TRUE)] = "nonwear" + data1 = readPHBCount(filename = filesForThisPerson[file1], timeformat = timeformat, + desiredtz = desiredtz, configtz = configtz, + timeformatName = timeformatName) + deviceSN = data1$deviceSN } # Sleep wake scores if (length(file2) > 0) { - data2 = as.data.frame(readxl::read_excel(path = filesForThisPerson[file2], col_types = "text", skip = 8), row.names = FALSE) - colnames(data2)[grep(pattern = "sleepWake", x = colnames(data2), ignore.case = TRUE)] = "sleep" + data2 = readPHBCount(filename = filesForThisPerson[file2], timeformat = timeformat, + desiredtz = desiredtz, configtz = configtz, + timeformatName = timeformatName) } if (length(file1) > 0 && length(file2) > 0) { - data2 = data2[, which(colnames(data2) != "sleepEventMarker")] - data = merge(data1, data2, by = "timeStamp") + data2$data = data2$data[, which(colnames(data2$data) != "sleepEventMarker")] + data = merge(data1$data, data2$data, by = "timestamp") } else { if (length(file1) > 0) { - data = data1 + data = data1$data } else { - data = data2 + data = data2$data } } - colnames(data)[grep(pattern = "timeStamp", x = colnames(data))] = "timestamp" - newName = gsub(pattern = "Sleep_Wake", replacement = "def", x = basename(filesForThisPerson[file2])) + colnames(data)[grep(pattern = "timestamp", x = colnames(data))] = "timestamp" + newName = gsub(pattern = "Sleep_Wake", replacement = "def", x = basename(filesForThisPerson[file2]), ignore.case = TRUE) newName = paste0(unlist(strsplit(newName, "[.]")) , collapse = paste0("_", deviceSN, ".")) newName = gsub(pattern = "xlsx", replacement = "csv", x = newName) outputfile = paste0(outputPath, "/", newName) diff --git a/R/readActiGraphCount.R b/R/readActiGraphCount.R index 5045a03..b268471 100644 --- a/R/readActiGraphCount.R +++ b/R/readActiGraphCount.R @@ -1,5 +1,9 @@ readActiGraphCount = function(filename = NULL, - timeformat = "%m/%d/%Y %H:%M:%S", tz = "", timeformatName = "timeformat") { + timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "", + configtz = NULL, + timeformatName = "timeformat") { + if (length(configtz) == 0) configtz = desiredtz # In GGIR set timeformatName to extEpochData_timeformat deviceSerialNumber = NULL @@ -138,7 +142,7 @@ readActiGraphCount = function(filename = NULL, starttime = fileHeader$value[grep(pattern = "starttime", x = fileHeader$item)] startdate = fileHeader$value[grep(pattern = "startdate", x = fileHeader$item)] timestamp = paste0(startdate, " ", starttime) - timestamp_POSIX = as.POSIXlt(timestamp, tz = tz, + timestamp_POSIX = as.POSIXct(timestamp, tz = configtz, format = timeformat) } else if (headerAvailable == FALSE) { # Extract date/timestamp from first values of column @@ -152,7 +156,7 @@ readActiGraphCount = function(filename = NULL, timecol = grep("time|epoch", colnames(tmp), ignore.case = TRUE) timestamp = paste0(tmp[, datecol], " ", tmp[1, timecol]) format = timeformat - timestamp_POSIX = as.POSIXlt(timestamp, tz = tz, format = format) + timestamp_POSIX = as.POSIXct(timestamp, tz = configtz, format = format) if (all(is.na(timestamp_POSIX))) { stop(paste0("\nTimestamps are not available in the file, neither has", " it a header to extract the timestamps from. Therefore, the file", @@ -169,6 +173,13 @@ readActiGraphCount = function(filename = NULL, timeformat = timeformat, timeformatName = timeformatName) + + # Establish starttime in the correct timezone + if (configtz != desiredtz) { + timestamp_POSIX = as.POSIXct(x = as.numeric(timestamp_POSIX), tz = desiredtz, + origin = "1970-01-01") + } + invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX, deviceSerialNumber = deviceSerialNumber)) diff --git a/R/readActicalCount.R b/R/readActicalCount.R index 86dbf10..404ff66 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -1,8 +1,10 @@ readActicalCount = function(filename = NULL, - timeformat = "%m/%d/%Y %H:%M:%S", tz = "", + timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "", + configtz = NULL, timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat - + if (length(configtz) == 0) configtz = desiredtz # ! Assumptions that timeseries start before line 1000 startindex = 300 quote = detectQuote(fn = filename, index = startindex) @@ -41,7 +43,7 @@ readActicalCount = function(filename = NULL, D = D[, grep(pattern = "time|date|counts|steps", x = colnames(D))] timestamp_POSIX = as.POSIXct(x = paste(D$date[1:4], D$time[1:4], sep = " "), format = timeformat, - tz = tz) + tz = configtz) checkTimeFormat(timestamp_POSIX[1], rawValue = paste(D$date[1], D$time[1], sep = " "), timeformat = timeformat, @@ -51,7 +53,12 @@ readActicalCount = function(filename = NULL, D = D[, -which(colnames(D) %in% c("date", "time"))] D = as.matrix(D, drop = FALSE) if (quote == "") D = apply(D, 2, as.numeric) - + + # Establish starttime in the correct timezone + if (configtz != desiredtz) { + timestamp_POSIX = as.POSIXct(x = as.numeric(timestamp_POSIX), tz = desiredtz, + origin = "1970-01-01") + } invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX)) } \ No newline at end of file diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index c581174..f7efb04 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -1,8 +1,11 @@ readActiwatchCount = function(filename = NULL, - timeformat = "%m/%d/%Y %H:%M:%S", tz = "", + timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "", + configtz = NULL, timeformatName = "timeformat") { # In GGIR set timeformatName to extEpochData_timeformat + if (length(configtz) == 0) configtz = desiredtz fileExtension = tolower(getExtension(filename)) if (fileExtension == "csv") { @@ -36,7 +39,7 @@ readActiwatchCount = function(filename = NULL, D = D[, grep(pattern = "time|date|counts|sleep|nonwear", x = colnames(D))] timestamp_POSIX = as.POSIXct(x = paste(D$date[1:4], D$time[1:4], sep = " "), format = timeformat, - tz = tz) + tz = configtz) checkTimeFormat(timestamp_POSIX[1], rawValue = paste(D$date[1], D$time[1], sep = " "), timeformat = timeformat, @@ -78,7 +81,7 @@ readActiwatchCount = function(filename = NULL, # Get starttime timestampFormat = paste0(unlist(strsplit(timeformat, " "))[1], " %H:%M") timestamp_POSIX = as.POSIXct(x = paste(header[2], header[3], sep = " "), - format = timestampFormat, tz = tz) + format = timestampFormat, tz = configtz) checkTimeFormat(timestamp_POSIX, rawValue = header[2], timeformat = timeformat, @@ -87,6 +90,12 @@ readActiwatchCount = function(filename = NULL, } D = as.matrix(D, drop = FALSE) if (quote == "") D = apply(D, 2, as.numeric) + + # Establish starttime in the correct timezone + if (configtz != desiredtz) { + timestamp_POSIX = as.POSIXct(x = as.numeric(timestamp_POSIX), tz = desiredtz, + origin = "1970-01-01") + } invisible(list(data = D, epochSize = epSizeShort, startTime = timestamp_POSIX)) } \ No newline at end of file diff --git a/R/readFitbit.R b/R/readFitbit.R index 99f440b..4dc05dd 100644 --- a/R/readFitbit.R +++ b/R/readFitbit.R @@ -1,4 +1,5 @@ -readFitbit = function(filename = NULL) { +readFitbit = function(filename = NULL, desiredtz = "", + configtz = NULL) { # Assumptions made: # - sleep is sampled at 30 second resolution # - steps are sampled at 60 second resolution @@ -16,7 +17,7 @@ readFitbit = function(filename = NULL) { #------------------------------------------------- # Main code - + if (length(configtz) == 0) configtz = desiredtz D = jsonlite::read_json(path = filename, simplifyVector = FALSE, flatten = FALSE) @@ -30,7 +31,7 @@ readFitbit = function(filename = NULL) { for (i in 1:length(D)) { tmp = D[[i]][15]$levels data = as.data.frame(data.table::rbindlist(tmp$data, fill = TRUE)) - data$dateTime = as.POSIXct(data$dateTime, format = "%Y-%m-%dT%H:%M:%S") + data$dateTime = as.POSIXct(data$dateTime, format = "%Y-%m-%dT%H:%M:%S", tz = configtz) if (i == 1) { all_data = data } else { @@ -38,7 +39,7 @@ readFitbit = function(filename = NULL) { } if ("shortData" %in% names(tmp)) { shortData = data.table::rbindlist(tmp$shortData, fill = TRUE) - shortData$dateTime = as.POSIXct(shortData$dateTime, format = "%Y-%m-%dT%H:%M:%S") + shortData$dateTime = as.POSIXct(shortData$dateTime, format = "%Y-%m-%dT%H:%M:%S", tz = configtz) if (i == 1) { all_shortData = shortData } else { @@ -74,12 +75,17 @@ readFitbit = function(filename = NULL) { } else if (dataType == "steps" || dataType == "calories") { epochSize = 60 data = as.data.frame(data.table::rbindlist(D, fill = TRUE)) - data$dateTime = as.POSIXct(data$dateTime, format = "%m/%d/%y %H:%M:%S") + data$dateTime = as.POSIXct(data$dateTime, format = "%m/%d/%y %H:%M:%S", tz = configtz) D = handleTimeGaps(data, epochSize = 60) D$value = as.numeric(D$value) colnames(D)[2] = dataType } else { stop("File type not recognised") } + # Establish starttime in the correct timezone + if (configtz != desiredtz) { + D$dateTime = as.POSIXct(x = as.numeric(D$dateTime), tz = desiredtz, + origin = "1970-01-01") + } return(D) } \ No newline at end of file diff --git a/R/readPHBCount.R b/R/readPHBCount.R new file mode 100644 index 0000000..5a1eff8 --- /dev/null +++ b/R/readPHBCount.R @@ -0,0 +1,43 @@ +readPHBCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "", configtz = NULL, + timeformatName = "timeformat") { + if (length(configtz) == 0) configtz = desiredtz + deviceSN = NULL + if (length(grep(pattern = "datalist", x = filename, ignore.case = TRUE)) > 0) { + data = as.data.frame(readxl::read_excel(path = filename, + col_types = "text", skip = 8), + row.names = FALSE) + header = as.data.frame(readxl::read_excel(path = filename, + col_types = "text", n_max = 8, + .name_repair = "unique_quiet"), + row.names = FALSE)[, 1] + SNlocation = grep(pattern = "deviceSN", x = header) + if (length(SNlocation) > 0) { + deviceSN = unlist(strsplit(header[grep(pattern = "deviceSN", x = header)], " ")) + deviceSN = deviceSN[length(deviceSN)] + } + colnames(data)[grep(pattern = "counts", x = colnames(data), ignore.case = TRUE)] = "counts" + colnames(data)[grep(pattern = "offWrist", x = colnames(data), ignore.case = TRUE)] = "nonwear" + data$counts = as.numeric(data$counts) + data$nonwear = as.numeric(data$counts) + } else { + data = as.data.frame(readxl::read_excel(path = filename, col_types = "text", skip = 8), row.names = FALSE) + colnames(data)[grep(pattern = "sleepWake", x = colnames(data), ignore.case = TRUE)] = "sleep" + data$sleep = as.numeric(data$sleep) + } + colnames(data)[grep(pattern = "timeStamp", x = colnames(data))] = "timestamp" + rawValue = data$timestamp[1] + data$timestamp = as.POSIXct(data$timestamp, format = timeformat, tz = configtz, + origin = "1970-01-01") + + checkTimeFormat(data$timestamp[1], + rawValue = rawValue, + timeformat = timeformat, + timeformatName = timeformatName) + # Establish starttime in the correct timezone + if (configtz != desiredtz) { + data$timestamp = as.POSIXct(x = as.numeric(data$timestamp), tz = desiredtz, + origin = "1970-01-01") + } + invisible(list(data = data, deviceSN = deviceSN)) +} \ No newline at end of file diff --git a/man/mergePHBfilePairs.Rd b/man/mergePHBfilePairs.Rd index db1911e..e285bc3 100644 --- a/man/mergePHBfilePairs.Rd +++ b/man/mergePHBfilePairs.Rd @@ -9,7 +9,10 @@ xlsx file to csv. } \usage{ - mergePHBfilePairs(inputPath = ".", outputPath = ".") + mergePHBfilePairs(inputPath = ".", outputPath = ".", + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", + desiredtz = "", configtz = NULL, + timeformatName = "timeformat") } \arguments{ \item{inputPath}{ @@ -20,6 +23,24 @@ \item{outputPath}{ Character, path to store the merge output } + \item{timeformat}{ + Character, timestemp format. + } + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{timeformatName}{ + Character, name of timeformat variable to print in error message when + timeformat is incorrect, of use to GGIR where argument names can differ. + } } \value{ Function does not output values. Instead it stores the merged data as file in the location diff --git a/man/readActiGraphCount.Rd b/man/readActiGraphCount.Rd index 2663086..a41e027 100644 --- a/man/readActiGraphCount.Rd +++ b/man/readActiGraphCount.Rd @@ -7,8 +7,9 @@ Reads ActiGraph Count data file. Currently a variety of csv format are facilitated. } \usage{ - readActiGraphCount(filename = NULL, - timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", + readActiGraphCount(filename = NULL, + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", + desiredtz = "", configtz = NULL, timeformatName = "timeformat") } \arguments{ @@ -18,8 +19,16 @@ \item{timeformat}{ Character, timestemp format. } - \item{tz}{ - Character, timezone name from the timezone database names. + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones } \item{timeformatName}{ Character, name of timeformat variable to print in error message when diff --git a/man/readActicalCount.Rd b/man/readActicalCount.Rd index f8650eb..e467bfa 100644 --- a/man/readActicalCount.Rd +++ b/man/readActicalCount.Rd @@ -8,7 +8,8 @@ } \usage{ readActicalCount(filename = NULL, - timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", + desiredtz = "", configtz = NULL, timeformatName = "timeformat") } \arguments{ @@ -18,8 +19,16 @@ \item{timeformat}{ Character, timestemp format. } - \item{tz}{ - Character, timezone name from the timezone database names. + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones } \item{timeformatName}{ Character, name of timeformat variable to print in error message when diff --git a/man/readActiwatchCount.Rd b/man/readActiwatchCount.Rd index 67f58b6..329dbe0 100644 --- a/man/readActiwatchCount.Rd +++ b/man/readActiwatchCount.Rd @@ -8,7 +8,8 @@ } \usage{ readActiwatchCount(filename = NULL, - timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", tz = "", + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", + desiredtz = "", configtz = NULL, timeformatName = "timeformat") } \arguments{ @@ -18,8 +19,16 @@ \item{timeformat}{ Character, timestemp format. } - \item{tz}{ - Character, timezone name from the timezone database names. + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones } \item{timeformatName}{ Character, name of timeformat variable to print in error message when diff --git a/man/readFitbit.Rd b/man/readFitbit.Rd index 8d5a323..8bb3131 100644 --- a/man/readFitbit.Rd +++ b/man/readFitbit.Rd @@ -7,12 +7,23 @@ Reads Fitbit data file (json) with sleep, steps or calories. } \usage{ - readFitbit(filename = NULL) + readFitbit(filename = NULL, desiredtz = "", configtz = NULL) } \arguments{ \item{filename}{ Character, filename (required) of json file } + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } } \value{ Data.frame with data converted to time series diff --git a/man/readPHBCount.Rd b/man/readPHBCount.Rd new file mode 100644 index 0000000..4394073 --- /dev/null +++ b/man/readPHBCount.Rd @@ -0,0 +1,43 @@ +\name{readPHBCount} +\alias{readPHBCount} +\title{ + Read PHB Count data files (xlsx) +} +\description{ + Reads Philips Health Band (PHB) Count data file. +} +\usage{ + readPHBCount(filename = NULL, + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", + desiredtz = "", configtz = NULL, + timeformatName = "timeformat") + } +\arguments{ + \item{filename}{ + filename (required) + } + \item{timeformat}{ + Character, timestemp format. + } + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{timeformatName}{ + Character, name of timeformat variable to print in error message when + timeformat is incorrect, of use to GGIR where argument names can differ. + } +} +\value{ + Data.frame with time series, exact column names can vary between xlsx files. +} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/tests/testthat/test_mergePHBfilePairs.R b/tests/testthat/test_mergePHBfilePairs.R index d516697..354585b 100644 --- a/tests/testthat/test_mergePHBfilePairs.R +++ b/tests/testthat/test_mergePHBfilePairs.R @@ -12,7 +12,9 @@ test_that("merging of PHB files goes correctly", { invisible(file.copy(from = file2, to = path, overwrite = TRUE)) # apply function to merge the files - mergePHBfilePairs(inputPath = path, outputPath = path) + mergePHBfilePairs(inputPath = path, outputPath = path, + timeformat = "%m-%d-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") # check whether merged file exists newfiles = dir(path, full.names = TRUE) @@ -25,7 +27,7 @@ test_that("merging of PHB files goes correctly", { expect_equal(ncol(data), 19) expect_equal(sum(data$counts), 50898) expect_equal(sum(data$steps), 1) - expect_equal(data$timestamp[1], "11-05-2022 01:10:00") + expect_equal(data$timestamp[1], "2022-11-05 01:10:00") # clean up if (dir.exists(path)) unlink(path, recursive = TRUE) diff --git a/tests/testthat/test_readActiGraphCount.R b/tests/testthat/test_readActiGraphCount.R index fea1b90..8512333 100644 --- a/tests/testthat/test_readActiGraphCount.R +++ b/tests/testthat/test_readActiGraphCount.R @@ -2,7 +2,8 @@ library(GGIRread) context("read ActiGraph csv files") test_that("ActiGraph61 is correctly read", { file = system.file("testfiles/ActiGraph61.csv", package = "GGIRread") - D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") expect_equal(D$deviceSerialNumber, "MOS2D16160581") expect_equal(D$epochSize, 5) expect_equal(format(D$startTime), "2016-08-15 21:35:00") @@ -14,7 +15,8 @@ test_that("ActiGraph61 is correctly read", { test_that("ActiGraph31 is correctly read", { file = system.file("testfiles/ActiGraph13.csv", package = "GGIRread") - D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", tz = "") + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") expect_equal(D$deviceSerialNumber, "CLE2A2123456") expect_equal(D$epochSize, 15) expect_equal(format(D$startTime), "2013-08-26 09:00:00") @@ -26,7 +28,8 @@ test_that("ActiGraph31 is correctly read", { test_that("ActiGraph13_timestamps_headers.csv is correctly read", { file = system.file("testfiles/ActiGraph13_timestamps_headers.csv", package = "GGIRread") - D = readActiGraphCount(filename = file, timeformat = "%d-%m-%Y %H:%M:%S", tz = "") + D = readActiGraphCount(filename = file, timeformat = "%d-%m-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") expect_equal(D$deviceSerialNumber, "TAS1D48140206") expect_equal(D$epochSize, 1) expect_equal(format(D$startTime), "2017-12-09 15:00:00") @@ -41,4 +44,22 @@ test_that("Actiwatch csv error correctly", { expect_error(readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S"), regexp = "Time format*") -}) \ No newline at end of file +}) + +test_that("Timezones are correctly handled", { + file = system.file("testfiles/ActiGraph61.csv", package = "GGIRread") + # Configured and worn in same place + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") + expect_equal(format(D$startTime), "2016-08-15 21:35:00") + + # Configured 1 hour earlier than timezone where device was worn + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "Europe/London", configtz = "Europe/Amsterdam") + expect_equal(format(D$startTime), "2016-08-15 20:35:00") + + # Configured 6 hours later than timezone where device was worn + D = readActiGraphCount(filename = file, timeformat = "%m/%d/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam", configtz = "America/New_York") + expect_equal(format(D$startTime), "2016-08-16 03:35:00") +}) diff --git a/tests/testthat/test_readActicalCount.R b/tests/testthat/test_readActicalCount.R index 033b5b5..3d35bd2 100644 --- a/tests/testthat/test_readActicalCount.R +++ b/tests/testthat/test_readActicalCount.R @@ -2,7 +2,8 @@ library(GGIRread) context("read Actical files") test_that("Actical csv is correctly read", { file = system.file("testfiles/Actical.csv", package = "GGIRread") - D = readActicalCount(filename = file, timeformat = "%d-%b-%y %H:%M", tz = "") + D = readActicalCount(filename = file, timeformat = "%d-%b-%y %H:%M", + desiredtz = "Europe/Amsterdam") expect_equal(D$epochSize, 60) expect_equal(format(D$startTime), "2021-05-13") expect_equal(nrow(D$data), 501) @@ -13,6 +14,26 @@ test_that("Actical csv is correctly read", { test_that("Actical csv error correctly", { file = system.file("testfiles/Actical.csv", package = "GGIRread") expect_error(readActicalCount(filename = file, - timeformat = "%d/%m/%Y %H:%M", tz = ""), + timeformat = "%d/%m/%Y %H:%M", + desiredtz = "Europe/Amsterdam"), regexp = "Time format*") -}) \ No newline at end of file +}) + + +test_that("Timezones are correctly handled", { + file = system.file("testfiles/Actical.csv", package = "GGIRread") + # Configured and worn in same place + D = readActicalCount(filename = file, timeformat = "%d-%b-%y %H:%M", + desiredtz = "Europe/Amsterdam") + expect_equal(format(D$startTime), "2021-05-13") + + # Configured 1 hour earlier than timezone where device was worn + D = readActicalCount(filename = file, timeformat = "%d-%b-%y %H:%M", + desiredtz = "Europe/London", configtz = "Europe/Amsterdam") + expect_equal(format(D$startTime), "2021-05-12 23:00:00") + + # Configured 6 hours later than timezone where device was worn + D = readActicalCount(filename = file, timeformat = "%d-%b-%y %H:%M", + desiredtz = "Europe/Amsterdam", configtz = "America/New_York") + expect_equal(format(D$startTime), "2021-05-13 06:00:00") +}) diff --git a/tests/testthat/test_readActiwatchCount.R b/tests/testthat/test_readActiwatchCount.R index 69a6235..5678b92 100644 --- a/tests/testthat/test_readActiwatchCount.R +++ b/tests/testthat/test_readActiwatchCount.R @@ -2,7 +2,8 @@ library(GGIRread) context("read Actiwatch files") test_that("Actiwatch csv is correctly read", { file = system.file("testfiles/Actiwatch.csv", package = "GGIRread") - D = readActiwatchCount(filename = file, timeformat = "%d/%m/%Y %H:%M:%S", tz = "") + D = readActiwatchCount(filename = file, timeformat = "%d/%m/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") expect_equal(D$epochSize, 15) expect_equal(format(D$startTime), "2019-11-23 06:00:00") expect_equal(nrow(D$data), 860) @@ -13,7 +14,8 @@ test_that("Actiwatch csv is correctly read", { }) test_that("Actiwatch awd is correctly read", { file = system.file("testfiles/Actiwatch.AWD", package = "GGIRread") - D = readActiwatchCount(filename = file, timeformat = "%d-%b-%Y %H:%M:%S", tz = "") + D = readActiwatchCount(filename = file, timeformat = "%d-%b-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") expect_equal(D$epochSize, 60) expect_equal(format(D$startTime), "2009-10-01 17:00:00") expect_equal(nrow(D$data), 329) @@ -42,4 +44,22 @@ test_that("checkTimeFormat also detects implausible year", { timeformatName = NULL), regexpr = "Timestamp recognised as 0021*") +}) + +test_that("Timezones are correctly handled", { + file = system.file("testfiles/Actiwatch.csv", package = "GGIRread") + # Configured and worn in same place + D = readActiwatchCount(filename = file, timeformat = "%d/%m/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") + expect_equal(format(D$startTime), "2019-11-23 06:00:00") + + # Configured 1 hour earlier than timezone where device was worn + D = readActiwatchCount(filename = file, timeformat = "%d/%m/%Y %H:%M:%S", + desiredtz = "Europe/London", configtz = "Europe/Amsterdam") + expect_equal(format(D$startTime), "2019-11-23 05:00:00") + + # Configured 6 hours later than timezone where device was worn + D = readActiwatchCount(filename = file, timeformat = "%d/%m/%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam", configtz = "America/New_York") + expect_equal(format(D$startTime), "2019-11-23 12:00:00") }) \ No newline at end of file diff --git a/tests/testthat/test_readFitbit.R b/tests/testthat/test_readFitbit.R index eff3235..b95d500 100644 --- a/tests/testthat/test_readFitbit.R +++ b/tests/testthat/test_readFitbit.R @@ -3,7 +3,7 @@ context("read Fitbit json") test_that("Fitbit json is correctly read", { # Sleep file = system.file("testfiles/sleep-1995-06-23_Fitbit.json", package = "GGIRread") - D = readFitbit(filename = file) + D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") expect_equal(nrow(D), 695) expect_equal(ncol(D), 3) expect_equal(format(D$dateTime[1]), "1995-07-11 02:28:30") @@ -13,7 +13,7 @@ test_that("Fitbit json is correctly read", { # Steps file = system.file("testfiles/steps-1995-06-23_Fitbit.json", package = "GGIRread") - D = readFitbit(filename = file) + D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") expect_equal(nrow(D), 34) expect_equal(ncol(D), 2) expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") @@ -21,9 +21,25 @@ test_that("Fitbit json is correctly read", { # Calories file = system.file("testfiles/calories-1995-06-23_Fitbit.json", package = "GGIRread") - D = readFitbit(filename = file) + D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") expect_equal(nrow(D), 47) expect_equal(ncol(D), 2) expect_equal(format(D$dateTime[1]), "1995-06-23") expect_equal(sum(D$calories), 69.56) -}) \ No newline at end of file +}) + +test_that("Timezones are correctly handled", { + file = system.file("testfiles/sleep-1995-06-23_Fitbit.json", package = "GGIRread") + # Configured and worn in same place + D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") + expect_equal(format(D$dateTime[1]), "1995-07-11 02:28:30") + + # Configured 1 hour earlier than timezone where device was worn + D = readFitbit(filename = file, desiredtz = "Europe/London", configtz = "Europe/Amsterdam") + expect_equal(format(D$dateTime[1]), "1995-07-11 01:28:30") + + # Configured 6 hours later than timezone where device was worn + D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam", + configtz = "America/New_York") + expect_equal(format(D$dateTime[1]), "1995-07-11 08:28:30") +}) diff --git a/tests/testthat/test_readPHBCount.R b/tests/testthat/test_readPHBCount.R new file mode 100644 index 0000000..bc1bf49 --- /dev/null +++ b/tests/testthat/test_readPHBCount.R @@ -0,0 +1,49 @@ +library(GGIRread) +context("read PHB files") +test_that("PHB Datalist xlsx is correctly read", { + file = system.file("testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") + D = readPHBCount(filename = file, timeformat = "%m-%d-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") + expect_equal(format(D$data$timestamp[1]), "2022-11-04 23:58:00") + expect_equal(nrow(D$data), 491) + expect_equal(ncol(D$data), 18) + expect_equal(sum(D$data$counts, na.rm = TRUE), 240393) +}) + + +test_that("PHB Sleep_wake xlsx is correctly read", { + file = system.file("testfiles/Sleep_Wake_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") + D = readPHBCount(filename = file, timeformat = "%m-%d-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") + expect_equal(format(D$data$timestamp[1]), "2022-11-05 01:10:00") + expect_equal(nrow(D$data), 491) + expect_equal(ncol(D$data), 3) + expect_equal(sum(D$data$sleep, na.rm = TRUE), 445) +}) + +test_that("PHB xlsx error correctly", { + file = system.file("testfiles/Sleep_Wake_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") + expect_error(readPHBCount(filename = file, + timeformat = "%d/%m/%Y %H:%M", + desiredtz = "Europe/Amsterdam"), + regexp = "Time format*") +}) + + +test_that("Timezones are correctly handled", { + file = system.file("testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") + # Configured and worn in same place + D = readPHBCount(filename = file, timeformat = "%m-%d-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam") + expect_equal(format(D$data$timestamp[1]), "2022-11-04 23:58:00") + + # Configured 1 hour earlier than timezone where device was worn + D = readPHBCount(filename = file, timeformat = "%m-%d-%Y %H:%M:%S", + desiredtz = "Europe/London", configtz = "Europe/Amsterdam") + expect_equal(format(D$data$timestamp[1]), "2022-11-04 22:58:00") + + # Configured 6 hours later than timezone where device was worn + D = readPHBCount(filename = file, timeformat = "%m-%d-%Y %H:%M:%S", + desiredtz = "Europe/Amsterdam", configtz = "America/New_York") + expect_equal(format(D$data$timestamp[1]), "2022-11-05 04:58:00") +}) From 3eab46021ff6e962fae6ed4c95067f57082b6e86 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Mon, 30 Sep 2024 11:30:49 +0200 Subject: [PATCH 15/25] simplify PHB functionality to just read and merge #68 --- R/mergePHBfilePairs.R | 73 ++---- R/readPHBCount.R | 15 +- ...4567890_PhilipsHealthBand_000100621938.csv | 247 ------------------ man/mergePHBfilePairs.Rd | 22 +- tests/testthat/test_mergePHBfilePairs.R | 31 +-- 5 files changed, 55 insertions(+), 333 deletions(-) delete mode 100644 inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv diff --git a/R/mergePHBfilePairs.R b/R/mergePHBfilePairs.R index 6281b8f..2333217 100644 --- a/R/mergePHBfilePairs.R +++ b/R/mergePHBfilePairs.R @@ -1,57 +1,40 @@ -mergePHBfilePairs = function(inputPath = ".", outputPath = ".", +mergePHBfilePairs = function(filenames = NULL, timeformat = "%m/%d/%Y %H:%M:%S", desiredtz = "", configtz = NULL, timeformatName = "timeformat") { # merges Philips Health Band xlsx files per participant # as there can be multiple files per participant. - fnames = dir(inputPath, recursive = FALSE, full.names = TRUE, pattern = "[.]xlsx") - fileOverview = data.frame(filename = fnames) - extractID = function(x) { - x = basename(x) - x = gsub(pattern = "sleep_wake", replacement = "sleepwake", x = tolower(x)) - ID = unlist(strsplit(x, "_"))[2] - return(ID) + if (length(filenames) != 2) { + stop("Provide two filenames") } - fileOverview$ID = unlist(lapply(fileOverview$filename, FUN = extractID)) - uids = unique(fileOverview$ID) - for (uid in uids) { - filesForThisPerson = fileOverview$filename[which(fileOverview$ID == uid)] - # Identify both file - file1 = grep(pattern = "datalist", x = filesForThisPerson, ignore.case = TRUE) - file2 = grep(pattern = "sleep_wake", x = filesForThisPerson, ignore.case = TRUE) - if (length(file1) == 0 && length(file2) == 0) { - next - } - # Data - deviceSN = NULL + # Identify both file + file1 = grep(pattern = "datalist", x = filenames, ignore.case = TRUE) + file2 = grep(pattern = "sleep_wake", x = filenames, ignore.case = TRUE) + + # Datalist file (with all variables except sleep/wake scores) + deviceSN = NULL + if (length(file1) > 0) { + data1 = readPHBCount(filename = filenames[file1], timeformat = timeformat, + desiredtz = desiredtz, configtz = configtz, + timeformatName = timeformatName) + deviceSN = data1$deviceSN + } + # Sleep wake scores file + if (length(file2) > 0) { + data2 = readPHBCount(filename = filenames[file2], timeformat = timeformat, + desiredtz = desiredtz, configtz = configtz, + timeformatName = timeformatName) + } + if (length(file1) > 0 && length(file2) > 0) { + data2$data = data2$data[, which(colnames(data2$data) != "sleepEventMarker")] + data = merge(data1$data, data2$data, by = "timestamp") + } else { if (length(file1) > 0) { - data1 = readPHBCount(filename = filesForThisPerson[file1], timeformat = timeformat, - desiredtz = desiredtz, configtz = configtz, - timeformatName = timeformatName) - deviceSN = data1$deviceSN - } - # Sleep wake scores - if (length(file2) > 0) { - data2 = readPHBCount(filename = filesForThisPerson[file2], timeformat = timeformat, - desiredtz = desiredtz, configtz = configtz, - timeformatName = timeformatName) - } - if (length(file1) > 0 && length(file2) > 0) { - data2$data = data2$data[, which(colnames(data2$data) != "sleepEventMarker")] - data = merge(data1$data, data2$data, by = "timestamp") + data = data1$data } else { - if (length(file1) > 0) { - data = data1$data - } else { - data = data2$data - } + data = data2$data } - colnames(data)[grep(pattern = "timestamp", x = colnames(data))] = "timestamp" - newName = gsub(pattern = "Sleep_Wake", replacement = "def", x = basename(filesForThisPerson[file2]), ignore.case = TRUE) - newName = paste0(unlist(strsplit(newName, "[.]")) , collapse = paste0("_", deviceSN, ".")) - newName = gsub(pattern = "xlsx", replacement = "csv", x = newName) - outputfile = paste0(outputPath, "/", newName) - write.csv(x = data, file = outputfile, row.names = FALSE) } + invisible(list(data = data, deviceSN = deviceSN)) } \ No newline at end of file diff --git a/R/readPHBCount.R b/R/readPHBCount.R index 5a1eff8..b25b0a8 100644 --- a/R/readPHBCount.R +++ b/R/readPHBCount.R @@ -1,12 +1,13 @@ readPHBCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", desiredtz = "", configtz = NULL, timeformatName = "timeformat") { + if (length(configtz) == 0) configtz = desiredtz deviceSN = NULL if (length(grep(pattern = "datalist", x = filename, ignore.case = TRUE)) > 0) { data = as.data.frame(readxl::read_excel(path = filename, - col_types = "text", skip = 8), - row.names = FALSE) + col_types = "text", skip = 8), + row.names = FALSE) header = as.data.frame(readxl::read_excel(path = filename, col_types = "text", n_max = 8, .name_repair = "unique_quiet"), @@ -15,11 +16,17 @@ readPHBCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", if (length(SNlocation) > 0) { deviceSN = unlist(strsplit(header[grep(pattern = "deviceSN", x = header)], " ")) deviceSN = deviceSN[length(deviceSN)] - } + } colnames(data)[grep(pattern = "counts", x = colnames(data), ignore.case = TRUE)] = "counts" colnames(data)[grep(pattern = "offWrist", x = colnames(data), ignore.case = TRUE)] = "nonwear" + for (varname in c("counts", "steps", "nonwear")) { + if (varname %in% colnames(data) == FALSE) { + stop(paste0("Expected column ", varname, " not found in file ", filename), call. = TRUE) + } + } data$counts = as.numeric(data$counts) data$nonwear = as.numeric(data$counts) + data$steps = as.numeric(data$steps) } else { data = as.data.frame(readxl::read_excel(path = filename, col_types = "text", skip = 8), row.names = FALSE) colnames(data)[grep(pattern = "sleepWake", x = colnames(data), ignore.case = TRUE)] = "sleep" @@ -37,7 +44,7 @@ readPHBCount = function(filename = NULL, timeformat = "%m/%d/%Y %H:%M:%S", # Establish starttime in the correct timezone if (configtz != desiredtz) { data$timestamp = as.POSIXct(x = as.numeric(data$timestamp), tz = desiredtz, - origin = "1970-01-01") + origin = "1970-01-01") } invisible(list(data = data, deviceSN = deviceSN)) } \ No newline at end of file diff --git a/inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv b/inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv deleted file mode 100644 index b464778..0000000 --- a/inst/testfiles/def_AH1234567890_PhilipsHealthBand_000100621938.csv +++ /dev/null @@ -1,247 +0,0 @@ -"timestamp","counts","heartRate","respirationRate","totalEnergyExpenditure","activeEnergyExpenditure","steps","nonwear","runDuration","walkDuration","activeMinutes","restingHeartRate","heartRateRecovery","cardioFitnessIndex","vo2Max","batteryDischarge","sleepEventMarker","missingData","sleep" -"11-05-2022 01:10:00","475","53","17","149.6173","0.0764","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:11:00","305","52","21","151.0414","0.1011","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:12:00","608","52","17","152.5025","0.1344","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:13:00","160","50","18","153.8994","0.0767","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:14:00","735","51","20","155.3830","0.1547","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:15:00","1345","52","19","156.8386","0.1294","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:16:00","144","55","17","158.5574","0.3664","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:17:00","243","54","19","159.9361","0.0603","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:18:00","171","53","17","161.3136","0.0592","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:19:00","63","54","17","162.6497","0.0219","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:20:00","761","55","18","164.0025","0.0369","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:21:00","1330","55","NaN","165.7321","0.3761","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:22:00","144","55","18","167.1846","0.1267","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:23:00","1669","52","17","168.7497","0.2281","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:24:00","356","52","18","170.2722","0.1897","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:25:00","122","51","19","171.6327","0.0439","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:26:00","121","50","19","172.9815","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:27:00","729","51","19","174.4491","0.1403","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:28:00","1027","51","NaN","176.0438","0.2547","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:29:00","116","49","19","177.4303","0.0672","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:30:00","101","47","16","178.7790","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:31:00","484","50","7","180.2040","0.1019","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:32:00","114","50","15","181.5673","0.0464","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:33:00","113","49","16","182.9161","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:34:00","111","48","16","184.2648","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:35:00","798","49","17","185.7552","0.1608","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 01:36:00","70","49","11","187.1309","0.0575","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:37:00","54","47","15","188.4611","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:38:00","54","48","15","189.7914","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:39:00","54","49","12","191.1216","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:40:00","58","48","8","192.4519","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:41:00","55","48","10","193.7821","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:42:00","56","49","13","195.1124","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:43:00","52","49","16","196.4426","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:44:00","51","48","11","197.7728","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:45:00","51","49","11","199.1031","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:46:00","50","47","15","200.4333","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:47:00","52","48","11","201.7636","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:48:00","80","47","13","203.0975","0.0200","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:49:00","46","47","14","204.4278","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:50:00","43","48","11","205.7580","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:51:00","44","47","12","207.0883","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:52:00","45","48","17","208.4185","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:53:00","49","48","17","209.7488","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:54:00","43","48","18","211.0790","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:55:00","45","48","17","212.4093","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:56:00","42","47","13","213.7395","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:57:00","175","47","15","215.0750","0.0214","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:58:00","46","47","12","216.4275","0.0367","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 01:59:00","43","47","15","217.7577","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:00:00","47","47","17","219.0880","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:01:00","45","47","17","220.4182","0.0167","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:02:00","45","47","17","221.7485","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:03:00","45","48","17","223.0787","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:04:00","1401","50","18","224.5367","0.1317","1","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:05:00","118","48","15","226.1046","0.2306","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:06:00","93","45","15","227.4583","0.0378","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:07:00","94","46","12","228.7889","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:08:00","93","47","13","230.1191","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:09:00","92","47","16","231.4494","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:10:00","92","47","16","232.7796","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:11:00","96","47","15","234.1099","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:12:00","104","47","14","235.4441","0.0203","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:13:00","90","47","9","236.7790","0.0208","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:14:00","89","47","16","238.1093","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:15:00","90","47","14","239.4395","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:16:00","90","48","10","240.7698","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:17:00","90","47","12","242.1000","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:18:00","102","48","16","243.4377","0.0233","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:19:00","93","47","14","244.7679","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:20:00","94","48","15","246.0981","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:21:00","97","48","16","247.4324","0.0203","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:22:00","266","47","16","248.8068","0.0564","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:23:00","116","47","15","250.1568","0.0344","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:24:00","122","47","14","251.5056","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:25:00","111","48","14","252.8543","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:26:00","102","47","12","254.1985","0.0292","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:27:00","170","48","14","255.5318","0.0194","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:28:00","96","48","16","256.8889","0.0408","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:29:00","97","48","17","258.2225","0.0197","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:30:00","94","48","6","259.5528","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:31:00","93","48","12","260.8830","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:32:00","89","48","13","262.2133","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:33:00","1318","55","11","263.8333","0.2775","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:34:00","84","44","16","265.2198","0.0672","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:35:00","87","47","16","266.5555","0.0217","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:36:00","87","46","16","267.8858","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:37:00","88","46","16","269.2161","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:38:00","329","47","16","270.5611","0.0300","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:39:00","154","52","18","271.9626","0.0808","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:40:00","84","45","15","273.3012","0.0242","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:41:00","82","45","15","274.6315","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:42:00","82","45","15","275.9617","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:43:00","85","48","15","277.2920","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:44:00","185","49","16","278.6420","0.0344","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:45:00","101","47","14","279.9917","0.0342","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:46:00","110","46","15","281.3321","0.0258","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:47:00","70","47","16","282.6624","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:48:00","88","48","17","283.9960","0.0197","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:49:00","66","45","16","285.3262","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:50:00","90","45","12","286.6574","0.0175","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:51:00","69","48","15","287.9877","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:52:00","217","48","13","289.3528","0.0481","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:53:00","81","46","16","290.6905","0.0233","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:54:00","82","47","14","292.0210","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:55:00","73","45","15","293.3513","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:56:00","1297","49","13","294.7873","0.1119","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:57:00","181","47","NaN","296.5975","0.4486","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:58:00","103","47","NaN","297.9691","0.0539","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 02:59:00","96","45","13","299.3120","0.0281","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:00:00","90","45","15","300.6423","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:01:00","90","46","16","301.9725","0.0167","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:02:00","88","45","15","303.3028","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:03:00","133","46","16","304.6392","0.0222","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:04:00","203","46","15","306.0028","0.0467","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:05:00","85","44","15","307.3500","0.0319","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:06:00","113","45","16","308.6920","0.0272","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:07:00","85","45","15","310.0222","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:08:00","266","46","15","311.3741","0.0361","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:09:00","90","45","15","312.7386","0.0475","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:10:00","94","45","16","314.0747","0.0219","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:11:00","93","46","16","315.4049","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:12:00","113","46","16","316.7358","0.0172","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:13:00","88","46","16","318.0756","0.0253","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:14:00","87","47","16","319.4059","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:15:00","86","46","16","320.7361","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:16:00","90","47","16","322.0663","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:17:00","87","46","16","323.3966","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:18:00","88","46","16","324.7268","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:19:00","89","46","16","326.0571","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:20:00","89","47","16","327.3874","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:21:00","90","47","17","328.7176","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:22:00","91","47","16","330.0479","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:23:00","90","46","16","331.3781","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:24:00","90","46","17","332.7083","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:25:00","1177","48","17","334.1222","0.0919","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:26:00","144","53","17","335.9157","0.4336","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:27:00","92","43","17","337.2830","0.0500","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:28:00","1445","56","17","339.0090","0.3728","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 03:29:00","147","43","12","340.4852","0.1481","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:30:00","111","43","6","341.8395","0.0383","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:31:00","124","44","12","343.1883","0.0333","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:32:00","604","44","15","344.6550","0.1394","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:33:00","166","43","16","346.0753","0.0978","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:34:00","2625","44","14","347.6342","0.2225","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 03:35:00","77","43","16","349.3531","0.3664","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:36:00","75","43","15","350.7108","0.0414","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:37:00","78","43","15","352.0410","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:38:00","81","43","15","353.3713","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:39:00","84","44","14","354.7015","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:40:00","120","43","16","356.0435","0.0272","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:41:00","68","43","14","357.3750","0.0178","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:42:00","74","44","15","358.7053","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:43:00","91","45","16","360.0395","0.0203","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:44:00","149","43","16","361.3852","0.0306","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:45:00","58","44","15","362.7191","0.0200","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:46:00","65","44","16","364.0494","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:47:00","58","44","15","365.3796","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:48:00","408","46","15","366.7207","0.0264","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:49:00","642","52","15","368.2762","0.2194","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:50:00","61","44","16","369.6179","0.0269","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:51:00","44","44","15","370.9482","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:52:00","50","46","16","372.2784","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:53:00","56","45","16","373.6087","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:54:00","49","44","14","374.9389","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:55:00","60","46","14","376.2691","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:56:00","45","44","13","377.5994","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:57:00","48","45","16","378.9296","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:58:00","46","45","14","380.2599","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 03:59:00","45","46","15","381.5901","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:00:00","45","47","16","382.9204","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:01:00","44","45","16","384.2506","0.0167","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:02:00","47","46","16","385.5809","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:03:00","48","47","16","386.9111","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:04:00","50","47","16","388.2414","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:05:00","50","47","15","389.5716","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:06:00","49","47","16","390.9018","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:07:00","53","46","15","392.2321","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:08:00","2226","53","16","394.0695","0.4731","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 04:09:00","81","45","16","395.5053","0.1117","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:10:00","625","52","17","396.9830","0.1494","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:11:00","35","44","15","398.3238","0.0261","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:12:00","77","45","16","399.6590","0.0211","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:13:00","35","44","16","400.9892","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:14:00","37","44","17","402.3195","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:15:00","35","45","17","403.6497","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:16:00","34","45","13","404.9800","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:17:00","31","44","18","406.2951","0.0031","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:18:00","36","47","11","407.6164","0.0086","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:19:00","39","52","8","408.9466","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:20:00","47","57","10","410.2769","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 04:21:00","1198","53","15","412.2281","0.5756","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:22:00","42","42","12","413.6093","0.0625","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:23:00","47","46","8","414.9395","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:24:00","50","45","9","416.2697","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:25:00","52","47","7","417.6000","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:26:00","51","46","9","418.9303","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:27:00","74","45","15","420.2605","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:28:00","70","46","15","421.5908","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:29:00","75","45","13","422.9210","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:30:00","618","47","12","424.2883","0.0500","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:31:00","1079","53","12","425.9768","0.3392","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:32:00","67","41","10","427.3404","0.0467","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:33:00","72","43","8","428.6707","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:34:00","150","43","15","430.0198","0.0336","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:35:00","83","44","10","431.3525","0.0189","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:36:00","1078","49","15","432.8787","0.1931","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:37:00","125","45","13","434.3432","0.1375","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:38:00","94","41","14","435.6926","0.0339","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:39:00","101","41","14","437.0296","0.0228","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:40:00","98","43","14","438.3722","0.0278","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:41:00","101","42","16","439.7043","0.0183","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:42:00","104","45","16","441.0518","0.0322","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:43:00","644","44","13","442.4861","0.1103","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:44:00","93","43","15","443.8738","0.0683","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:45:00","114","46","15","445.2220","0.0328","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:46:00","83","43","12","446.5574","0.0214","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:47:00","101","44","13","447.8914","0.0200","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:48:00","199","45","11","449.2336","0.0275","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:49:00","92","43","8","450.5929","0.0428","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:50:00","1699","45","13","452.0571","0.1372","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","0" -"11-05-2022 04:51:00","179","47","15","453.8639","0.4456","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:52:00","62","41","16","455.2210","0.0408","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:53:00","58","42","15","456.5513","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:54:00","59","41","16","457.8815","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:55:00","78","43","16","459.2120","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:56:00","62","44","16","460.5423","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:57:00","57","41","15","461.8725","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:58:00","66","43","16","463.2028","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 04:59:00","60","45","17","464.5330","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:00:00","755","49","19","466.0179","0.1558","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:01:00","79","40","13","467.3834","0.0483","0","0","0","0","0","53","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:02:00","149","43","14","468.7364","0.0372","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:03:00","82","43","15","470.0719","0.0214","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:04:00","92","44","15","471.4022","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:05:00","88","43","12","472.7340","0.0181","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:06:00","87","46","14","474.0642","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:07:00","86","44","14","475.3944","0.0167","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:08:00","164","46","15","476.7395","0.0300","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:09:00","88","43","15","478.0846","0.0300","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:10:00","129","45","12","479.4281","0.0286","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:11:00","137","43","11","480.7722","0.0292","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:12:00","130","43","12","482.1293","0.0408","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:13:00","261","43","16","483.5062","0.0586","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:14:00","95","43","11","484.8556","0.0339","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" -"11-05-2022 05:15:00","94","45","14","486.1861","0.0169","0","0","0","0","0","NaN","NaN","NaN","NaN","0","0","0","1" diff --git a/man/mergePHBfilePairs.Rd b/man/mergePHBfilePairs.Rd index e285bc3..b10f129 100644 --- a/man/mergePHBfilePairs.Rd +++ b/man/mergePHBfilePairs.Rd @@ -9,19 +9,16 @@ xlsx file to csv. } \usage{ - mergePHBfilePairs(inputPath = ".", outputPath = ".", - timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", - desiredtz = "", configtz = NULL, - timeformatName = "timeformat") + mergePHBfilePairs(filenames = NULL, + timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", + desiredtz = "", configtz = NULL, + timeformatName = "timeformat") } \arguments{ - \item{inputPath}{ - Character, file path where xlsx files are located that need to be merged. - Assumption is that there is either one file starting with "Datalist_", one starting - with "Sleep_Wake_", or both for each recording. - } - \item{outputPath}{ - Character, path to store the merge output + \item{filenames}{ + Character vector, specifying the two filenames to be merged. + Assumption is that there is one file starting with "Datalist_" and one starting + with "Sleep_Wake_". } \item{timeformat}{ Character, timestemp format. @@ -43,8 +40,7 @@ } } \value{ - Function does not output values. Instead it stores the merged data as file in the location - as specified by outputPath. + Merged data from the two files. } \author{ Vincent T van Hees diff --git a/tests/testthat/test_mergePHBfilePairs.R b/tests/testthat/test_mergePHBfilePairs.R index 354585b..39c1b3b 100644 --- a/tests/testthat/test_mergePHBfilePairs.R +++ b/tests/testthat/test_mergePHBfilePairs.R @@ -4,32 +4,15 @@ test_that("merging of PHB files goes correctly", { # prepare folder with test files file1 = system.file("testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") file2 = system.file("testfiles/Sleep_Wake_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") - path = "./phb_test_folder" - if (!dir.exists(path)) { - dir.create(path) - } - invisible(file.copy(from = file1, to = path, overwrite = TRUE)) - invisible(file.copy(from = file2, to = path, overwrite = TRUE)) - # apply function to merge the files - mergePHBfilePairs(inputPath = path, outputPath = path, + D = mergePHBfilePairs(filenames = c(file1, file2), timeformat = "%m-%d-%Y %H:%M:%S", desiredtz = "Europe/Amsterdam") - - # check whether merged file exists - newfiles = dir(path, full.names = TRUE) - newFile = newfiles[grep(pattern = "def_AH1234567890_PhilipsHealthBand_000100621938.csv", x = newfiles)] - expect_true(length(newFile) == 1) - - # check file content - data = read.csv(newFile) - expect_equal(nrow(data), 246) - expect_equal(ncol(data), 19) - expect_equal(sum(data$counts), 50898) - expect_equal(sum(data$steps), 1) - expect_equal(data$timestamp[1], "2022-11-05 01:10:00") - - # clean up - if (dir.exists(path)) unlink(path, recursive = TRUE) + expect_equal(nrow(D$data), 246) + expect_equal(ncol(D$data), 19) + expect_equal(sum(D$data$counts), 50898) + expect_equal(sum(D$data$steps), 1) + expect_equal(format(D$data$timestamp[1]), "2022-11-05 01:10:00") + expect_equal(D$deviceSN, "000100621938") }) \ No newline at end of file From 671a663c356c0c6224328a28d14e71568c67afd9 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Mon, 30 Sep 2024 14:28:17 +0200 Subject: [PATCH 16/25] add mergeFitbitData and allign with mergePHBdata #68 --- NAMESPACE | 4 +- R/mergeFitbitData.R | 22 +++++ R/{mergePHBfilePairs.R => mergePHBdata.R} | 2 +- README.md | 10 +- .../testfiles/calories-1995-06-23_Fitbit.json | 94 +++++++++---------- man/mergeFitbitData.Rd | 35 +++++++ man/{mergePHBfilePairs.Rd => mergePHBdata.Rd} | 6 +- tests/testthat/test_mergeFitbitData.R | 22 +++++ ...ergePHBfilePairs.R => test_mergePHBdata.R} | 3 +- tests/testthat/test_readFitbit.R | 2 +- 10 files changed, 140 insertions(+), 60 deletions(-) create mode 100644 R/mergeFitbitData.R rename R/{mergePHBfilePairs.R => mergePHBdata.R} (96%) create mode 100644 man/mergeFitbitData.Rd rename man/{mergePHBfilePairs.Rd => mergePHBdata.Rd} (94%) create mode 100644 tests/testthat/test_mergeFitbitData.R rename tests/testthat/{test_mergePHBfilePairs.R => test_mergePHBdata.R} (88%) diff --git a/NAMESPACE b/NAMESPACE index 2be517a..4e8b528 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,7 +1,9 @@ export(readGenea, readAxivity, readGENEActiv, GENEActivReader, resample, readWav, readActiGraphCount, readActiwatchCount, - readActicalCount, mergePHBfilePairs) + readActicalCount, readPHBCount, + readFitbit, mergePHBdata, + mergeFitbitData) useDynLib(GGIRread, .registration = TRUE) importFrom(Rcpp, sourceCpp) importFrom(data.table, fread) diff --git a/R/mergeFitbitData.R b/R/mergeFitbitData.R new file mode 100644 index 0000000..7163b5e --- /dev/null +++ b/R/mergeFitbitData.R @@ -0,0 +1,22 @@ +mergeFitbitData = function(filenames = NULL, desiredtz = "", configtz = NULL) { + if (length(filenames) < 2) { + stop("Provide at least two filenames") + } + cnt = 1 + while (cnt <= length(filenames)) { + D = readFitbit(filename = filenames[cnt], desiredtz = desiredtz, configtz = configtz) + if (cnt == 1) { + data = D + } else { + if (length(intersect(x = data$dateTime, D$dateTime)) == 0) { + warning(paste0("Time series do not intersect for files ", + basename(filenames[cnt]), " and ", basename(filenames[cnt - 1])), + call. = FALSE) + } + + data = merge(data, D, by = "dateTime", all = TRUE) + } + cnt = cnt + 1 + } + return(data) +} \ No newline at end of file diff --git a/R/mergePHBfilePairs.R b/R/mergePHBdata.R similarity index 96% rename from R/mergePHBfilePairs.R rename to R/mergePHBdata.R index 2333217..fc802de 100644 --- a/R/mergePHBfilePairs.R +++ b/R/mergePHBdata.R @@ -1,4 +1,4 @@ -mergePHBfilePairs = function(filenames = NULL, +mergePHBdata = function(filenames = NULL, timeformat = "%m/%d/%Y %H:%M:%S", desiredtz = "", configtz = NULL, timeformatName = "timeformat") { diff --git a/README.md b/README.md index 8cc1940..5db9a59 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ Brand | Device name | File extension | Data type | GGIRread function Axivity Ltd https://axivity.com/ | AX3 and AX6 | .cwa | raw gravitational units |readAxivity ActivInsights Ltd https://activinsights.com/ | GENEActiv Original and Sleep | .bin | raw gravitational units | readGENEActiv Unilever Discover Ltd | Genea (no longer manufactured) | .bin | raw gravitational units | readGenea -ActiGraph | ??? | .csv | count data | readActigraph -Actiwatch | ??? | .csv and .awd | count data | readActiwatch -Actical | ??? | .csv | count data | readActical.R -Philips Health Band | ??? | .xlsx | count data | mergePHBfilePairs.R -Fitbit | ??? | .json | sleep, steps or calories data | readFitbit.R +ActiGraph | ??? | .csv | count data | readActigraphCount +Actiwatch | ??? | .csv and .awd | count data | readActiwatchCount +Actical | ??? | .csv | count data | readActicalCount +Philips Health Band | ??? | .xlsx | count data | readPHBCount +Fitbit | ??? | .json | sleep, steps or calories data | readFitbit diff --git a/inst/testfiles/calories-1995-06-23_Fitbit.json b/inst/testfiles/calories-1995-06-23_Fitbit.json index 81f1294..29103bb 100644 --- a/inst/testfiles/calories-1995-06-23_Fitbit.json +++ b/inst/testfiles/calories-1995-06-23_Fitbit.json @@ -1,142 +1,142 @@ [{ - "dateTime" : "06/23/95 00:00:00", + "dateTime" : "06/24/95 16:00:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:01:00", + "dateTime" : "06/24/95 16:01:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:02:00", + "dateTime" : "06/24/95 16:02:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:03:00", + "dateTime" : "06/24/95 16:03:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:04:00", + "dateTime" : "06/24/95 16:04:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:05:00", + "dateTime" : "06/24/95 16:05:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:06:00", + "dateTime" : "06/24/95 16:06:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:07:00", + "dateTime" : "06/24/95 16:07:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:08:00", + "dateTime" : "06/24/95 16:08:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:09:00", + "dateTime" : "06/24/95 16:09:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:10:00", + "dateTime" : "06/24/95 16:10:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:11:00", + "dateTime" : "06/24/95 16:11:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:12:00", + "dateTime" : "06/24/95 16:12:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:13:00", + "dateTime" : "06/24/95 16:13:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:14:00", + "dateTime" : "06/24/95 16:14:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:15:00", + "dateTime" : "06/24/95 16:15:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:16:00", + "dateTime" : "06/24/95 16:16:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:17:00", + "dateTime" : "06/24/95 16:17:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:18:00", + "dateTime" : "06/24/95 16:18:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:19:00", + "dateTime" : "06/24/95 16:19:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:20:00", + "dateTime" : "06/24/95 16:20:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:21:00", + "dateTime" : "06/24/95 16:21:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:22:00", + "dateTime" : "06/24/95 16:22:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:23:00", + "dateTime" : "06/24/95 16:23:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:24:00", + "dateTime" : "06/24/95 16:24:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:25:00", + "dateTime" : "06/24/95 16:25:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:26:00", + "dateTime" : "06/24/95 16:26:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:27:00", + "dateTime" : "06/24/95 16:27:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:28:00", + "dateTime" : "06/24/95 16:28:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:29:00", + "dateTime" : "06/24/95 16:29:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:30:00", + "dateTime" : "06/24/95 16:30:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:31:00", + "dateTime" : "06/24/95 16:31:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:32:00", + "dateTime" : "06/24/95 16:32:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:33:00", + "dateTime" : "06/24/95 16:33:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:34:00", + "dateTime" : "06/24/95 16:34:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:35:00", + "dateTime" : "06/24/95 16:35:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:36:00", + "dateTime" : "06/24/95 16:36:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:37:00", + "dateTime" : "06/24/95 16:37:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:38:00", + "dateTime" : "06/24/95 16:38:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:39:00", + "dateTime" : "06/24/95 16:39:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:40:00", + "dateTime" : "06/24/95 16:40:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:41:00", + "dateTime" : "06/24/95 16:41:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:42:00", + "dateTime" : "06/24/95 16:42:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:43:00", + "dateTime" : "06/24/95 16:43:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:44:00", + "dateTime" : "06/24/95 16:44:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:45:00", + "dateTime" : "06/24/95 16:45:00", "value" : "1.48" },{ - "dateTime" : "06/23/95 00:46:00", + "dateTime" : "06/24/95 16:46:00", "value" : "1.48" }] \ No newline at end of file diff --git a/man/mergeFitbitData.Rd b/man/mergeFitbitData.Rd new file mode 100644 index 0000000..bae6f14 --- /dev/null +++ b/man/mergeFitbitData.Rd @@ -0,0 +1,35 @@ +\name{mergeFitbitData} +\alias{mergeFitbitData} +\title{ + Merge Fitbit json files into one data.frame +} +\description{ + Read and merge Fitbit json files into one data.frame, and + give warning if time series do not intersect. +} +\usage{ + mergeFitbitData(filenames = NULL, + desiredtz = "", configtz = NULL) +} +\arguments{ + \item{filenames}{ + Character vector, specifying the filenames (at least two) to be merged. + } + \item{desiredtz}{ + Character, timezone name where the accelerometer was worn. Timezone names are + expected to be the timezone database names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } + \item{configtz}{ + Character, timezone name where the accelerometer was configured. Leave NULL + if equal to desiredtz. Timezones name are expected to be the timezone database + names, e.g. Europe/London. See also: + https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + } +} +\value{ + Merged data from the two or more files. +} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/man/mergePHBfilePairs.Rd b/man/mergePHBdata.Rd similarity index 94% rename from man/mergePHBfilePairs.Rd rename to man/mergePHBdata.Rd index b10f129..7770da4 100644 --- a/man/mergePHBfilePairs.Rd +++ b/man/mergePHBdata.Rd @@ -1,5 +1,5 @@ -\name{mergePHBfilePairs} -\alias{mergePHBfilePairs} +\name{mergePHBdata} +\alias{mergePHBdata} \title{ Merge Philips Health Band xlsx file pairs into one csv file } @@ -9,7 +9,7 @@ xlsx file to csv. } \usage{ - mergePHBfilePairs(filenames = NULL, + mergePHBdata(filenames = NULL, timeformat = "\%m/\%d/\%Y \%H:\%M:\%S", desiredtz = "", configtz = NULL, timeformatName = "timeformat") diff --git a/tests/testthat/test_mergeFitbitData.R b/tests/testthat/test_mergeFitbitData.R new file mode 100644 index 0000000..d5d8144 --- /dev/null +++ b/tests/testthat/test_mergeFitbitData.R @@ -0,0 +1,22 @@ +library(GGIRread) +context("merge PHB files") +test_that("merging of PHB files goes correctly", { + file1 = system.file("testfiles/steps-1995-06-23_Fitbit.json", package = "GGIRread") + file2 = system.file("testfiles/calories-1995-06-23_Fitbit.json", package = "GGIRread") + file3 = system.file("testfiles/sleep-1995-06-23_Fitbit.json", package = "GGIRread") + + # apply function to merge the files + D = mergeFitbitData(filenames = c(file1, file2), + desiredtz = "Europe/Amsterdam") + expect_equal(nrow(D), 47) + expect_equal(ncol(D), 3) + expect_equal(sum(D$steps, na.rm = TRUE), 607) + expect_equal(sum(D$calories, na.rm = TRUE), 69.56) + expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") + + # apply function to merge the files + expect_warning(mergeFitbitData(filenames = c(file1, file2, file3), + desiredtz = "Europe/Amsterdam"), + regexp = "Time series*") +}) + \ No newline at end of file diff --git a/tests/testthat/test_mergePHBfilePairs.R b/tests/testthat/test_mergePHBdata.R similarity index 88% rename from tests/testthat/test_mergePHBfilePairs.R rename to tests/testthat/test_mergePHBdata.R index 39c1b3b..43ed9a1 100644 --- a/tests/testthat/test_mergePHBfilePairs.R +++ b/tests/testthat/test_mergePHBdata.R @@ -1,11 +1,10 @@ library(GGIRread) context("merge PHB files") test_that("merging of PHB files goes correctly", { - # prepare folder with test files file1 = system.file("testfiles/DataList_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") file2 = system.file("testfiles/Sleep_Wake_AH1234567890_PhilipsHealthBand.xlsx", package = "GGIRread") # apply function to merge the files - D = mergePHBfilePairs(filenames = c(file1, file2), + D = mergePHBdata(filenames = c(file1, file2), timeformat = "%m-%d-%Y %H:%M:%S", desiredtz = "Europe/Amsterdam") expect_equal(nrow(D$data), 246) diff --git a/tests/testthat/test_readFitbit.R b/tests/testthat/test_readFitbit.R index b95d500..5601c32 100644 --- a/tests/testthat/test_readFitbit.R +++ b/tests/testthat/test_readFitbit.R @@ -24,7 +24,7 @@ test_that("Fitbit json is correctly read", { D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") expect_equal(nrow(D), 47) expect_equal(ncol(D), 2) - expect_equal(format(D$dateTime[1]), "1995-06-23") + expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") expect_equal(sum(D$calories), 69.56) }) From 9b1c1e7564c45763c08dc8b7b5d611cf60cb7092 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Mon, 30 Sep 2024 14:29:20 +0200 Subject: [PATCH 17/25] Update NEWS.md --- NEWS.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 2719601..afd06aa 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,8 +4,9 @@ - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. - Migrate read function for ActiGraph (csv) and Actiwatch (csv/awd) count data to GGIRread #68. - Add function for reading Actical (csv) count data #68. -- Add function to read and merge Philips Health Band file pairs (xlsx) #68. -- Add function for reading Fitbit (json) with sleep, steps or calories #68. +- Add functions for reading and mergerging Philips Health Band file pairs (xlsx) #68. +- Add functions for reading and merging Fitbit (json) with sleep, steps, and/or calories #68. + # Changes in version 1.0.1 (release date:03-06-2024) From 3a3d58857c2cbe2ecb13e0aa0a26cb25871ac66f Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Mon, 30 Sep 2024 18:06:19 +0200 Subject: [PATCH 18/25] migrate utils functions to their own function files #68 --- R/checkTimeFormat.R | 22 +++++++++++ R/detectQuote.R | 18 +++++++++ R/findStartData.R | 32 +++++++++++++++ R/getExtension.R | 9 +++++ R/readActicalCount.R | 2 +- R/readActiwatchCount.R | 4 +- R/utils_for_countdata.R | 87 ----------------------------------------- man/checkTimeFormat.Rd | 36 +++++++++++++++++ man/detectQuote.Rd | 27 +++++++++++++ man/findStartData.Rd | 31 +++++++++++++++ man/getExtension.Rd | 23 +++++++++++ 11 files changed, 201 insertions(+), 90 deletions(-) create mode 100644 R/checkTimeFormat.R create mode 100644 R/detectQuote.R create mode 100644 R/findStartData.R create mode 100644 R/getExtension.R delete mode 100644 R/utils_for_countdata.R create mode 100644 man/checkTimeFormat.Rd create mode 100644 man/detectQuote.Rd create mode 100644 man/findStartData.Rd create mode 100644 man/getExtension.Rd diff --git a/R/checkTimeFormat.R b/R/checkTimeFormat.R new file mode 100644 index 0000000..d50f4e3 --- /dev/null +++ b/R/checkTimeFormat.R @@ -0,0 +1,22 @@ +checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? ", + timeformatName = NULL) { + # If timestamp_POSIX is NA gieve error message to inform user that something went wrong. + if (is.na(timestamp_POSIX)) { + stop(paste0("\nTime format in data ", rawValue, + " does not match with time format ", timeformat, + " as specified by argument ", timeformatName, + ", please correct.\n"), call. = FALSE) + } else { + year = as.numeric(format(timestamp_POSIX, format = "%Y")) + if (year < 1980 || year > 2500) { + # Assumption that after 2500 no new ActiGraph data will be collected! + stop(paste0("\nTimestamp recognised as ", format(timestamp_POSIX), + " with year identified as ", year, + ". This does not seem to be correct. Raw timestamp value is stored as ", + rawValue, ". please change specification of ", + "argument ", timeformatName, " (currently ", + timeformat, ") to ensure correct interpretation of timestamp.\n"), + call. = FALSE) + } + } +} \ No newline at end of file diff --git a/R/detectQuote.R b/R/detectQuote.R new file mode 100644 index 0000000..7329a76 --- /dev/null +++ b/R/detectQuote.R @@ -0,0 +1,18 @@ +detectQuote = function(filename, skip) { + # data.table::fread has argument quote. + # On some computers the quotes in the files are + # not recognised, to catch this first try to check whether this is the case: + quote = "\"" + Dtest = NULL + try(expr = {Dtest = data.table::fread(input = filename, + header = FALSE, sep = ",", skip = skip, + nrows = 20, quote = quote)}, silent = TRUE) + if (length(Dtest) == 0) { + quote = "" + } else { + if (nrow(Dtest) <= 1) { + quote = "" + } + } + return(quote) +} \ No newline at end of file diff --git a/R/findStartData.R b/R/findStartData.R new file mode 100644 index 0000000..cb9c4fe --- /dev/null +++ b/R/findStartData.R @@ -0,0 +1,32 @@ +findStartData = function(filename, quote, startindex) { + # Function used to find start of time series in Actiwatch and Actical data + # ! Assumptions that timeseries start before line 1000 + while (startindex > 0) { + testraw = data.table::fread(input = filename, + header = FALSE, sep = ",", skip = startindex, + nrows = 2, data.table = FALSE, quote = quote) + if (length(testraw) > 0) { + if (nrow(testraw) == 2) { + if (testraw$V1[2] == testraw$V1[1] + 1) { + break + } + } + } + startindex = startindex - 100 + } + # ! Assumption that first column are the epoch numbers + delta = 1 - testraw$V1[1] + startindex = startindex + delta + startFound = FALSE + while (startFound == FALSE) { + Dtest = data.table::fread(input = filename, sep = ",", skip = startindex, quote = quote, nrows = 1) + if (Dtest$V1[1] == 1) { + startFound = TRUE + } else { + # This happens when file is has an empty row between each measurement point is stored + startindex = startindex - 1 + if (startindex < 1) stop("Could not find start of recording", call. = FALSE) + } + } + return(startindex) +} \ No newline at end of file diff --git a/R/getExtension.R b/R/getExtension.R new file mode 100644 index 0000000..6e9e6bc --- /dev/null +++ b/R/getExtension.R @@ -0,0 +1,9 @@ +getExtension <- function(filename){ + # Extract file extension + ex <- unlist(strsplit(basename(filename), split = "[.]")) + if (length(ex) < 2) stop(paste0("Cannot recognise extension from '", filename, "' as filename, please check"), call. = FALSE) + return(ex[-1]) +} + + + diff --git a/R/readActicalCount.R b/R/readActicalCount.R index 404ff66..ed1bcfd 100644 --- a/R/readActicalCount.R +++ b/R/readActicalCount.R @@ -7,7 +7,7 @@ readActicalCount = function(filename = NULL, if (length(configtz) == 0) configtz = desiredtz # ! Assumptions that timeseries start before line 1000 startindex = 300 - quote = detectQuote(fn = filename, index = startindex) + quote = detectQuote(filename = filename, skip = startindex) startindex = findStartData(filename, quote, startindex) # -1 because Actical starts at epoch 0 while function looks for epoch 1 startindex = startindex - 1 diff --git a/R/readActiwatchCount.R b/R/readActiwatchCount.R index f7efb04..b5caf6e 100644 --- a/R/readActiwatchCount.R +++ b/R/readActiwatchCount.R @@ -14,7 +14,7 @@ readActiwatchCount = function(filename = NULL, #========================================================= # ! Assumptions that timeseries start before line 1000 startindex = 1000 - quote = detectQuote(fn = filename, index = startindex) + quote = detectQuote(filename = filename, skip = startindex) index = findStartData(filename, quote, startindex) D = data.table::fread(input = filename, sep = ",", skip = index, quote = quote, data.table = FALSE) # ! Assumption that column names are present 2 lines prior to timeseries @@ -55,7 +55,7 @@ readActiwatchCount = function(filename = NULL, # ! Assumption that first data row equals the first row with 3 columns index = 0 - quote = detectQuote(fn = filename, index = 50) + quote = detectQuote(filename = filename, skip = 50) NC = 1 while (NC >= 3) { testraw = data.table::fread(input = filename, diff --git a/R/utils_for_countdata.R b/R/utils_for_countdata.R deleted file mode 100644 index ff471b1..0000000 --- a/R/utils_for_countdata.R +++ /dev/null @@ -1,87 +0,0 @@ -# Collection of short function used in functions -# - readActigraphCount -# - readActiwatchCount -#----------------------------------------------------------------------------------------- -checkTimeFormat = function(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? ", - timeformatName = NULL) { - # If timestamp_POSIX is NA gieve error message to inform user that something went wrong. - if (is.na(timestamp_POSIX)) { - stop(paste0("\nTime format in data ", rawValue, - " does not match with time format ", timeformat, - " as specified by argument ", timeformatName, - ", please correct.\n"), call. = FALSE) - } else { - year = as.numeric(format(timestamp_POSIX, format = "%Y")) - if (year < 1980 || year > 2500) { - # Assumption that after 2500 no new ActiGraph data will be collected! - stop(paste0("\nTimestamp recognised as ", format(timestamp_POSIX), - " with year identified as ", year, - ". This does not seem to be correct. Raw timestamp value is stored as ", - rawValue, ". please change specification of ", - "argument ", timeformatName, " (currently ", - timeformat, ") to ensure correct interpretation of timestamp.\n"), - call. = FALSE) - } - } -} - -detectQuote = function(fn, index) { - # data.table::fread has argument quote. - # On some computers the quotes in the files are - # not recognised, to catch this first try to check whether this is the case: - quote = "\"" - Dtest = NULL - try(expr = {Dtest = data.table::fread(input = fn, - header = FALSE, sep = ",", skip = index, - nrows = 20, quote = quote)}, silent = TRUE) - if (length(Dtest) == 0) { - quote = "" - } else { - if (nrow(Dtest) <= 1) { - quote = "" - } - } - return(quote) -} - -getExtension <- function(filename){ - # Extract file extension - ex <- unlist(strsplit(basename(filename), split = "[.]")) - if (length(ex) < 2) stop(paste0("Cannot recognise extension from '", filename, "' as filename, please check"), call. = FALSE) - return(ex[-1]) -} - - - -findStartData = function(filename, quote, startindex) { - # Function used to find start of time series in Actiwatch and Actical data - # ! Assumptions that timeseries start before line 1000 - while (startindex > 0) { - testraw = data.table::fread(input = filename, - header = FALSE, sep = ",", skip = startindex, - nrows = 2, data.table = FALSE, quote = quote) - if (length(testraw) > 0) { - if (nrow(testraw) == 2) { - if (testraw$V1[2] == testraw$V1[1] + 1) { - break - } - } - } - startindex = startindex - 100 - } - # ! Assumption that first column are the epoch numbers - delta = 1 - testraw$V1[1] - startindex = startindex + delta - startFound = FALSE - while (startFound == FALSE) { - Dtest = data.table::fread(input = filename, sep = ",", skip = startindex, quote = quote, nrows = 1) - if (Dtest$V1[1] == 1) { - startFound = TRUE - } else { - # This happens when file is has an empty row between each measurement point is stored - startindex = startindex - 1 - if (startindex < 1) stop("Could not find start of recording", call. = FALSE) - } - } - return(startindex) -} \ No newline at end of file diff --git a/man/checkTimeFormat.Rd b/man/checkTimeFormat.Rd new file mode 100644 index 0000000..266e3ee --- /dev/null +++ b/man/checkTimeFormat.Rd @@ -0,0 +1,36 @@ +\name{checkTimeFormat} +\alias{checkTimeFormat} +\title{ + Check timestamp format +} +\description{ + Helper function used internally. Generate informative error message if timestamp + could not be recognisede. +} +\usage{ + checkTimeFormat(timestamp_POSIX, rawValue = " ?? ", timeformat = " ?? ", + timeformatName = NULL) +} +\arguments{ + \item{timestamp_POSIX}{ + POSIX object with timestamp + } + \item{rawValue}{ + Timestamp value as encounterd in the data before processing + } + \item{timeformat}{ + Timestap format used for converting timestamp + } + \item{timeformatName}{ + Character with the argument name to specify the timeformat. + If used as dependency of GGIR then this argument name will be different. + } +} +\value{ + No output value is generated, only an error message if timestamp could not be + recognised. +} +\keyword{internal} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/man/detectQuote.Rd b/man/detectQuote.Rd new file mode 100644 index 0000000..d78d11c --- /dev/null +++ b/man/detectQuote.Rd @@ -0,0 +1,27 @@ +\name{detectQuote} +\alias{detectQuote} +\title{ + Detect quote +} +\description{ + Helper function used internally, used to find out what value should + be used for argument quote in function fread. +} +\usage{ + detectQuote(filename, skip) +} +\arguments{ + \item{filename}{ + Character + } + \item{skip}{ + skip + } +} +\value{ + Character with quote object to be used for fread +} +\keyword{internal} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/man/findStartData.Rd b/man/findStartData.Rd new file mode 100644 index 0000000..04a8943 --- /dev/null +++ b/man/findStartData.Rd @@ -0,0 +1,31 @@ +\name{findStartData} +\alias{findStartData} +\title{ + Find start of data inside text file. +} +\description{ + Helper function used internally. Finds variables start of the data in + Actiwatch and Actical data. +} +\usage{ + findStartData(filename, quote, startindex) +} +\arguments{ + \item{filename}{ + Character + } + \item{quote}{ + Quote as extracted with \link{detectQuote} + } + \item{startindex}{ + Start index where to start searching. For Actical we start at 300 while + for Actiwatch we start at 1000. + } +} +\value{ + Start index +} +\keyword{internal} +\author{ + Vincent T van Hees +} \ No newline at end of file diff --git a/man/getExtension.Rd b/man/getExtension.Rd new file mode 100644 index 0000000..01b3371 --- /dev/null +++ b/man/getExtension.Rd @@ -0,0 +1,23 @@ +\name{getExtension} +\alias{getExtension} +\title{ + Get File Extension +} +\description{ + Helper function used internally to get file extension. +} +\usage{ + getExtension(filename) +} +\arguments{ + \item{filename}{ + Character + } +} +\value{ + Character with file extension +} +\keyword{internal} +\author{ + Vincent T van Hees +} \ No newline at end of file From 75ef721c8ba6bcbf68a3ea7fd75ffe454b29fefa Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Mon, 30 Sep 2024 19:25:20 +0200 Subject: [PATCH 19/25] add extra check on timestamp --- R/mergePHBdata.R | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/R/mergePHBdata.R b/R/mergePHBdata.R index fc802de..b091915 100644 --- a/R/mergePHBdata.R +++ b/R/mergePHBdata.R @@ -28,7 +28,15 @@ mergePHBdata = function(filenames = NULL, } if (length(file1) > 0 && length(file2) > 0) { data2$data = data2$data[, which(colnames(data2$data) != "sleepEventMarker")] - data = merge(data1$data, data2$data, by = "timestamp") + d1 = data1$data + d2 = data2$data + if (length(which(is.na(d1$timestamp) == TRUE)) > 0 || + length(which(is.na(d2$timestamp) == TRUE)) > 0) { + stop(paste0("NA values are found in the timestamps, ", + "please check parameter ", timeformatName, + " which is set to ", timeformat), call. = FALSE) + } + data = merge(d1, d2, by = "timestamp") } else { if (length(file1) > 0) { data = data1$data From 0bb390a68555929152fbe2b5ec20ba06e0aa82bd Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 25 Oct 2024 10:57:05 +0200 Subject: [PATCH 20/25] Fitbit: convert step and calories to same resolution as sleep, and fix interpolation function --- R/readFitbit.R | 13 +++++++++---- man/readFitbit.Rd | 3 ++- tests/testthat/test_mergeFitbitData.R | 4 ++-- tests/testthat/test_readFitbit.R | 8 ++++---- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/R/readFitbit.R b/R/readFitbit.R index 4dc05dd..5da0114 100644 --- a/R/readFitbit.R +++ b/R/readFitbit.R @@ -11,7 +11,11 @@ readFitbit = function(filename = NULL, desiredtz = "", startTime = timeRange[1] endTime = timeRange[2] timeFrame = data.frame(dateTime = seq(startTime, endTime, by = epochSize)) - df = merge(df, timeFrame, by = c("dateTime"), all.x = TRUE) + df = merge(df, timeFrame, by = c("dateTime"), all.y = TRUE) + when_na = which(is.na(df$value)) + if (length(when_na) > 0) { + df$value[when_na] = df$value[when_na - 1] + } return(df) } @@ -73,11 +77,12 @@ readFitbit = function(filename = NULL, desiredtz = "", D = D[order(D$dateTime), ] colnames(D)[2] = "sleeplevel" } else if (dataType == "steps" || dataType == "calories") { - epochSize = 60 data = as.data.frame(data.table::rbindlist(D, fill = TRUE)) data$dateTime = as.POSIXct(data$dateTime, format = "%m/%d/%y %H:%M:%S", tz = configtz) - D = handleTimeGaps(data, epochSize = 60) - D$value = as.numeric(D$value) + # GGIR expects resolution to be consistent across variables + # so interpolate at 30 seconds to match resolution of sleep + D = handleTimeGaps(data, epochSize = 30) + D$value = as.numeric(D$value) / 2 colnames(D)[2] = dataType } else { stop("File type not recognised") diff --git a/man/readFitbit.Rd b/man/readFitbit.Rd index 8bb3131..54b8255 100644 --- a/man/readFitbit.Rd +++ b/man/readFitbit.Rd @@ -4,7 +4,8 @@ Read Fitbit data files (json) } \description{ - Reads Fitbit data file (json) with sleep, steps or calories. + Reads Fitbit data file (json) with sleep, steps or calories. Steps and calories + are converted to 30 second resolution to match resolution of sleep data. } \usage{ readFitbit(filename = NULL, desiredtz = "", configtz = NULL) diff --git a/tests/testthat/test_mergeFitbitData.R b/tests/testthat/test_mergeFitbitData.R index d5d8144..6c27166 100644 --- a/tests/testthat/test_mergeFitbitData.R +++ b/tests/testthat/test_mergeFitbitData.R @@ -8,10 +8,10 @@ test_that("merging of PHB files goes correctly", { # apply function to merge the files D = mergeFitbitData(filenames = c(file1, file2), desiredtz = "Europe/Amsterdam") - expect_equal(nrow(D), 47) + expect_equal(nrow(D), 93) expect_equal(ncol(D), 3) expect_equal(sum(D$steps, na.rm = TRUE), 607) - expect_equal(sum(D$calories, na.rm = TRUE), 69.56) + expect_equal(sum(D$calories, na.rm = TRUE), 68.82, tol = 0.01) expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") # apply function to merge the files diff --git a/tests/testthat/test_readFitbit.R b/tests/testthat/test_readFitbit.R index 5601c32..a2fdaec 100644 --- a/tests/testthat/test_readFitbit.R +++ b/tests/testthat/test_readFitbit.R @@ -14,18 +14,18 @@ test_that("Fitbit json is correctly read", { # Steps file = system.file("testfiles/steps-1995-06-23_Fitbit.json", package = "GGIRread") D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") - expect_equal(nrow(D), 34) + expect_equal(nrow(D), 71) expect_equal(ncol(D), 2) expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") - expect_equal(sum(D$steps), 607) + expect_equal(sum(D$steps, na.rm = TRUE), 607) # Calories file = system.file("testfiles/calories-1995-06-23_Fitbit.json", package = "GGIRread") D = readFitbit(filename = file, desiredtz = "Europe/Amsterdam") - expect_equal(nrow(D), 47) + expect_equal(nrow(D), 93) expect_equal(ncol(D), 2) expect_equal(format(D$dateTime[1]), "1995-06-24 16:00:00") - expect_equal(sum(D$calories), 69.56) + expect_equal(sum(D$calories, na.rm = TRUE), 68.82, tol = 0.01) }) test_that("Timezones are correctly handled", { From 0ca3cddfc2d02681370754d909d64994fb66f20a Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 25 Oct 2024 12:37:56 +0200 Subject: [PATCH 21/25] handle no internet connection during .onAttach (same fix as for GGIR issue 1203) --- R/zzz.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/zzz.R b/R/zzz.R index 2bc3de5..23f89c7 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -13,6 +13,7 @@ } pkgs <- available.packages(repos = repos) cran_version <- package_version(pkgs[which(pkgs[,1] == "GGIRread"),"Version"]) + if (length(cran_version) == 0) return() # handle no internet connection local_version <- utils::packageVersion("GGIRread") behind_cran <- cran_version > local_version if (interactive()) { From 187f48d9ba67cb2e6db26581f3b677c26efd6e90 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 25 Oct 2024 12:38:57 +0200 Subject: [PATCH 22/25] Update NEWS.md --- NEWS.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index afd06aa..43f18ff 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,10 +2,11 @@ - Added a `NEWS.md` file to track changes to the package. - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. +- GGIRread version look-up in .onattach() no longer crashes when computer is offline. - Migrate read function for ActiGraph (csv) and Actiwatch (csv/awd) count data to GGIRread #68. - Add function for reading Actical (csv) count data #68. -- Add functions for reading and mergerging Philips Health Band file pairs (xlsx) #68. -- Add functions for reading and merging Fitbit (json) with sleep, steps, and/or calories #68. +- Add functions for reading and merging Philips Health Band file pairs (xlsx) #68. +- Add functions for reading and merging Fitbit (json) files with sleep, steps, and/or calories #68. # Changes in version 1.0.1 (release date:03-06-2024) From bd26441ade3666aa8f4b55688ad00576d6ceb4ca Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 25 Oct 2024 12:55:42 +0200 Subject: [PATCH 23/25] update release version and date --- DESCRIPTION | 6 +++--- NEWS.md | 2 +- man/GGIRread-package.Rd | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d339294..2243f10 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: GGIRread Type: Package Title: Wearable Accelerometer Data File Readers -Version: 1.0.1 -Date: 2024-06-03 +Version: 1.0.2 +Date: 2024-10-26 Authors@R: c(person("Vincent T","van Hees",role=c("aut","cre"), email="v.vanhees@accelting.com"), person(given = "Patrick",family = "Bos", @@ -17,7 +17,7 @@ Authors@R: c(person("Vincent T","van Hees",role=c("aut","cre"), person("Medical Research Council UK", role = c("cph", "fnd")), person("Accelting", role = c("cph", "fnd"))) Maintainer: Vincent T van Hees -Description: Reads data collected from wearable acceleratometers as used in sleep and physical activity research. Currently supports file formats: binary data from 'GENEActiv' , .bin-format from GENEA devices (not for sale), and .cwa-format from 'Axivity' . Primarily designed to complement R package GGIR . +Description: Reads data collected from wearable acceleratometers as used in sleep and physical activity research. Currently supports file formats: binary data from 'GENEActiv' , .bin-format from GENEA devices (not for sale), and .cwa-format from 'Axivity' . Further, it has functions for reading text files with epoch level aggregates from Actical, Fitbit, Actiwatch, ActiGraph, and PhilipsHealthBand. Primarily designed to complement R package GGIR . URL: https://github.com/wadpac/GGIRread/ BugReports: https://github.com/wadpac/GGIRread/issues License: Apache License (== 2.0) diff --git a/NEWS.md b/NEWS.md index 43f18ff..9947046 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# Changes in version 1.0.2 (release date:??-??-2024) +# Changes in version 1.0.2 (release date:26-10-2024) - Added a `NEWS.md` file to track changes to the package. - Stops interactive calling of `chooseCRANmirror` on `.onAttach` if interactive and CRAN mirror not set GGIR #1141. diff --git a/man/GGIRread-package.Rd b/man/GGIRread-package.Rd index c8e03ec..64908f3 100755 --- a/man/GGIRread-package.Rd +++ b/man/GGIRread-package.Rd @@ -14,8 +14,8 @@ \tabular{ll}{ Package: \tab GGIRread\cr Type: \tab Package\cr - Version: \tab 1.0.0\cr - Date: \tab 2024-03-27\cr + Version: \tab 1.0.2\cr + Date: \tab 2024-10-26\cr License: \tab LGPL (>= 2.0, < 3)\cr } } From 868103f89a3fb380241dbf6098bceca0337d57ed Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 25 Oct 2024 12:56:19 +0200 Subject: [PATCH 24/25] tidy up prepareNewRelease as parts were no longer relevant --- prepareNewRelease.R | 46 --------------------------------------------- 1 file changed, 46 deletions(-) diff --git a/prepareNewRelease.R b/prepareNewRelease.R index 441b88e..f4e3992 100644 --- a/prepareNewRelease.R +++ b/prepareNewRelease.R @@ -49,51 +49,5 @@ prepareNewRelease = function(version = c()) { } i = i + 1 } - # # Check CITATION.cff - # CIT = read.csv(file = "./CITATION.cff",sep="\n") - # i = 1 - # while (i <= nrow(CIT)) { - # tmp = as.character(unlist(strsplit(as.character(CIT[i,]),": "))) - # if (tmp[1] == "version") { - # if (tmp[2] != version) { - # cat("\nError: Version number is not correct in CITATION.cff file") - # errorfound = TRUE - # } - # } - # if (tmp[1] == "date-released") { - # if (tmp[2] != date) { - # cat("\nError: Date is not correct in CITATION.cff file") - # errorfound = TRUE - # } - # } - # i = i + 1 - # } - # Check NEWs.rd file - NE = read.csv(file = "./inst/NEWS.Rd",sep="\n") - i = 1 - versioninfile = dateinfile = c() - while (i <= nrow(NE)) { - tmp = as.character(unlist(strsplit(as.character(NE[3,]),"version "))) - if (length(tmp) > 1) { - tmp2 = as.character(unlist(strsplit(as.character(tmp[2])," "))) - versioninfile= tmp2[1] - if (length(tmp2) > 2) { - tmp3 = as.character(unlist(strsplit(as.character(tmp2[3]),":"))[2]) - dateinfile = as.character(unlist(strsplit(as.character(tmp3),"[)]"))[1]) - } - } - if (length(versioninfile) > 0 & length(dateinfile) > 0) { - if (versioninfile != version) { - cat("\nError: Version number is not correct in NEWS.Rd file") - errorfound = TRUE - } - if (dateinfile != dateReversed) { - cat("\nError: Date is not correct in NEWS.Rd file") - errorfound = TRUE - } - break() # only check first date and version number - } - i = i + 1 - } if (errorfound == FALSE) cat(paste0("\nNo problem found. Package consistently uses version ",version," and release date ", dateReversed)) } \ No newline at end of file From 80a85082e3fbefe50a51f9a020e21d0b4bbe7d13 Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Fri, 25 Oct 2024 12:57:05 +0200 Subject: [PATCH 25/25] Update pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index eacfb2d..cfad7dd 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -6,5 +6,5 @@ Checklist before merging: - [ ] Existing tests still work (check by running the test suite, e.g. from RStudio). - [ ] Added tests (if you added functionality) or fixed existing test (if you fixed a bug). - [ ] Updated or expanded the documentation. -- [ ] Updated release notes in `inst/NEWS.Rd` with a user-readable summary. Please, include references to relevant issues or PR discussions. +- [ ] Updated release notes in `NEWS.md` with a user-readable summary. Please, include references to relevant issues or PR discussions. - [ ] Added your name to the contributors lists in the `DESCRIPTION` file, if you think you made a significant contribution.