Re: [R] Extract time and state of charge (Start and End) and Count
Hi Roslina, I think you have changed the code as "bc_start" in my code is "BCStartTime" in yours. When I run the attached code, I get a data frame "hourly_SoC" that looks right, and a matrix "result" (hour by SoC) that checks against the data frame. I have tried to comment the code so that you an see what I am doing. Jim On Wed, Jul 20, 2022 at 1:18 AM roslinazairimah zakaria wrote: > > Hi Jim, > > I tried to run your code and got this error. > > > # get the temporal order of observations > > obs_order <- order(c(as.numeric(dt$BCStartTime),as.numeric(dt$BCStopTime))) > Warning messages: > 1: In order(c(as.numeric(dt$BCStartTime), as.numeric(dt$BCStopTime))) : > NAs introduced by coercion > 2: In order(c(as.numeric(dt$BCStartTime), as.numeric(dt$BCStopTime))) : > NAs introduced by coercion > > numeric_time<-c(as.numeric(dt$BCStartTime),as.numeric(dt$BCStopTime))[obs_order] > Warning messages: > 1: NAs introduced by coercion > 2: NAs introduced by coercion > > nobs<-diff(range(numeric_time))/3600 > > # find the linear approximation of charge state by hours > > hourly_SoC <- approx(numeric_time, > + > c(dt$Starting_SoC_of_12,dt$Ending_SoC_of_12)[obs_order],n=nobs) > Error in approx(numeric_time, c(dt$Starting_SoC_of_12, > dt$Ending_SoC_of_12)[obs_order], : > need at least two non-NA values to interpolate > __ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Re: [R] Extract time and state of charge (Start and End) and Count
Hello, There was a bug in the way I copied your data to my R session, hence the NA's. Here is a tidyverse way of doing what you want. Its output matches the expected output in your last post. The column names don't start at zero because there was no Starting_SoC_of_12 equal to 0. library(tidyverse) result <- dt_2014 %>% mutate(Hour = lubridate::hour(BatteryChargeStartDate)) %>% group_by(Hour, Starting_SoC_of_12, Ending_SoC_of_12) %>% mutate(Count = n()) %>% ungroup() %>% arrange(Hour, Starting_SoC_of_12, Ending_SoC_of_12) %>% pivot_wider( id_cols = Hour, names_from = c(Starting_SoC_of_12, Ending_SoC_of_12), names_sep = "-", values_from = Count, values_fill = 0L ) i <- str_order(names(result)[-1], numeric = TRUE) result <- cbind(result[1], result[-1][i]) result # Hour 1-11 2-10 2-11 4-4 4-12 5-8 8-12 #17000 00 10 #28000 01 01 #3 15000 10 00 #4 16110 00 00 #5 18001 00 01 #6 21000 01 01 Hope this helps, Rui Barradas Às 16:10 de 19/07/2022, roslinazairimah zakaria escreveu: Hi Rui, I try to run your code, but all data became NA. Not sure why... # these columns need to be fixed cols <- c("BatteryChargeStartDate", "BatteryChargeStopDate") dt[cols] <- lapply(dt[cols], \(x) sub("\n", " ", x)) # use package lubridate to coerce to a datetime class library(lubridate) dt <- lapply(dt, lubridate::dmy_hm) dt dt[cols] <- lapply(dt[cols], lubridate::dmy_hm) h <- lubridate::hour(dt[["BatteryChargeStartDate"]]) aggregate(Starting_SoC_of_12 ~ h, dt, length) $BCStartTime [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [33] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [65] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [97] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [129] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [161] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [193] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [225] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [257] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [289] NA NA NA NA NA NA NA NA [929] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [961] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [993] NA NA NA NA NA NA NA NA [ reached 'max' / getOption("max.print") -- omitted 34418 entries ] dt[cols] <- lapply(dt[cols], lubridate::dmy_hm) Warning messages: 1: All formats failed to parse. No formats found. 2: All formats failed to parse. No formats found. h <- lubridate::hour(dt[["BatteryChargeStartDate"]]) aggregate(Starting_SoC_of_12 ~ h, dt, length) Error in aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) : no rows to aggregate On Tue, Jul 19, 2022 at 4:53 PM roslinazairimah zakaria < roslina...@gmail.com> wrote: Hi Rui, Yes, I would like to count for each hour, how many in the state of charge start 0 and SOC 12, then SOC 1 and SOC 12 and so on. Thank you for your help. On Tue, Jul 19, 2022 at 1:11 AM Rui Barradas wrote: Hello, I'm not sure I understand the problem. Do you want counts of how many rows are there per hour? # these columns need to be fixed cols <- c("BatteryChargeStartDate", "BatteryChargeStopDate") dt_2014[cols] <- lapply(dt_2014[cols], \(x) sub("\n", " ", x)) # use package lubridate to coerce to a datetime class dt_2014[cols] <- lapply(dt_2014[cols], lubridate::dmy_hm) h <- lubridate::hour(dt_2014[["BatteryChargeStartDate"]]) aggregate(Starting_SoC_of_12 ~ h, dt_2014, length) It would be better if you post the expected output corresponding to the posted data set. Hope this helps, Rui Barradas Às 05:04 de 18/07/2022, roslinazairimah zakaria escreveu: Dear all, I have data of Battery Electric vehicle (BEV). I would like to extract data from every hour starting from 0.00 to 0.59, 1:00-1:59 for SOC(state of charge) start to end. Some examples: I can extract data from SOC=0 and SOC=12 dt_2014[which(dt_2014$Starting_SoC_of_12==0 & dt_2014$Ending_SoC_of_12==12),] I can extract data from SOC=1 and SOC=12 dt_2014[which(dt_2014$Starting_SoC_of_12==1 & dt_2014$Ending_SoC_of_12==12),] and I would like to further categorise the data by hour and count how many cars from 0 state charge to 12 state charge at in that particular hour. Thank you so much for any help given. Some data dput(dt_2014[1:10,]) structure(list(ï..CarID =
Re: [R] Extract time and state of charge (Start and End) and Count
Hi Jim, I tried to run your code and got this error. > # get the temporal order of observations > obs_order <- order(c(as.numeric(dt$BCStartTime),as.numeric(dt$BCStopTime))) Warning messages: 1: In order(c(as.numeric(dt$BCStartTime), as.numeric(dt$BCStopTime))) : NAs introduced by coercion 2: In order(c(as.numeric(dt$BCStartTime), as.numeric(dt$BCStopTime))) : NAs introduced by coercion > numeric_time<-c(as.numeric(dt$BCStartTime),as.numeric(dt$BCStopTime))[obs_order] Warning messages: 1: NAs introduced by coercion 2: NAs introduced by coercion > nobs<-diff(range(numeric_time))/3600 > # find the linear approximation of charge state by hours > hourly_SoC <- approx(numeric_time, + c(dt$Starting_SoC_of_12,dt$Ending_SoC_of_12)[obs_order],n=nobs) Error in approx(numeric_time, c(dt$Starting_SoC_of_12, dt$Ending_SoC_of_12)[obs_order], : need at least two non-NA values to interpolate On Tue, Jul 19, 2022 at 3:22 PM roslinazairimah zakaria < roslina...@gmail.com> wrote: > Jim, > > Thank you so much! > > On Tue, Jul 19, 2022 at 3:05 PM Jim Lemon wrote: > >> Hi Roslina, >> The following gives you the state of charge for the vehicle in your >> example data for each hour. This is approximate as your times are not >> on even hours. >> >> # get the temporal order of observations >> >> obs_order<-order(c(as.numeric(dt_2014$bc_start),as.numeric(dt_2014$bc_stop))) >> >> numeric_time<-c(as.numeric(dt_2014$bc_start),as.numeric(dt_2014$bc_stop))[obs_order] >> nobs<-diff(range(numeric_time))/3600 >> # find the linear approximation of charge state by hours >> hourly_SoC<-approx(numeric_time, >> c(dt_2014$Starting_SoC_of_12,dt_2014$Ending_SoC_of_12)[obs_order],n=nobs) >> >> To get the POSIX times: >> >> hourly_POSIX<-seq(dt_2014$bc_start[1],dt_2014$bc_stop,length.out=nobs) >> >> That will fill part of your table. If you want the state of charge by >> hour regardless of day, you'll have to create a new "hour" variable >> from, hourly_POSIX, then: >> >> mean_charge_by_hour<-by(hourly_SoC$hour,hourly_SoC$y,mean) #untested >> since I don't know whether you want this >> >> Jim >> >> On Mon, Jul 18, 2022 at 2:04 PM roslinazairimah zakaria >> wrote: >> > >> > Dear all, >> > >> > I have data of Battery Electric vehicle (BEV). I would like to extract >> data >> > from every hour starting from 0.00 to 0.59, 1:00-1:59 for SOC(state of >> > charge) start to end. >> > >> > Some examples: >> > I can extract data from SOC=0 and SOC=12 >> > dt_2014[which(dt_2014$Starting_SoC_of_12==0 & >> > dt_2014$Ending_SoC_of_12==12),] >> > >> > I can extract data from SOC=1 and SOC=12 >> > dt_2014[which(dt_2014$Starting_SoC_of_12==1 & >> > dt_2014$Ending_SoC_of_12==12),] >> > >> > and I would like to further categorise the data by hour and count how >> many >> > cars from 0 state charge to 12 state charge at in that particular hour. >> > >> > Thank you so much for any help given. >> > >> > Some data >> > > dput(dt_2014[1:10,]) >> > structure(list(ï..CarID = c("GC10", "GC10", "GC10", "GC10", "GC10", >> > "GC10", "GC10", "GC10", "GC10", "GC10"), BatteryChargeStartDate = >> > c("16/2/2014 16:05", >> > "16/2/2014 18:20", "17/2/2014 8:10", "18/2/2014 7:41", "18/2/2014 >> 15:36", >> > "18/2/2014 16:36", "18/2/2014 21:26", "19/2/2014 8:57", "19/2/2014 >> 21:08", >> > "20/2/2014 18:11"), BCStartTime = c("16:05", "18:20", "8:10", >> > "7:41", "15:36", "16:36", "21:26", "8:57", "21:08", "18:11"), >> > Year = c(2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, >> > 2014L, 2014L, 2014L), Month = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, >> > 2L, 2L, 2L), Day = c(16L, 16L, 17L, 18L, 18L, 18L, 18L, 19L, >> > 19L, 20L), BatteryChargeStopDate = c("16/2/2014 17:05", "16/2/2014 >> > 19:00", >> > "17/2/2014 15:57", "18/2/2014 9:52", "18/2/2014 15:39", "18/2/2014 >> > 17:36", >> > "19/2/2014 1:55", "19/2/2014 14:25", "20/2/2014 5:17", "20/2/2014 >> 23:20" >> > ), BCStopTime = c("17:05", "19:00", "15:57", "9:52", "15:39", >> > "17:36", "1:55", "14:25", "5:17", "23:20"), Year2 = c(2014L, >> > 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L >> > ), Month2 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), Day2 = c(16L, >> > 16L, 17L, 18L, 18L, 18L, 19L, 19L, 20L, 20L), Starting_SoC_of_12 = >> > c(1L, >> > 2L, 4L, 5L, 4L, 2L, 8L, 8L, 4L, 8L), Ending_SoC_of_12 = c(11L, >> > 11L, 12L, 8L, 4L, 10L, 12L, 12L, 12L, 12L)), row.names = c(NA, >> > 10L), class = "data.frame") >> > >> > >> > -- >> > *Roslinazairimah Zakaria* >> > *Tel: +609-5492370; Fax. No.+609-5492766* >> > >> > *Email: roslina...@gmail.com * >> > University Malaysia Pahang >> > Lebuhraya Tun Razak, 26300 Gambang, Pahang, Malaysia >> > >> > [[alternative HTML version deleted]] >> > >> > __ >> > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> > https://stat.ethz.ch/mailman/listinfo/r-help >> > PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> > and provide
[R] Extract time and state of charge (Start and End) and Count
Dear all, I have data of Battery Electric vehicle (BEV). I would like to extract data from every hour starting from 0.00 to 0.59, 1:00-1:59 for SOC(state of charge) start to end. Some examples: I can extract data from SOC=0 and SOC=12 dt_2014[which(dt_2014$Starting_SoC_of_12==0 & dt_2014$Ending_SoC_of_12==12),] I can extract data from SOC=1 and SOC=12 dt_2014[which(dt_2014$Starting_SoC_of_12==1 & dt_2014$Ending_SoC_of_12==12),] and I would like to further categorise the data by hour and count how many cars from 0 state charge to 12 state charge at in that particular hour. Thank you so much for any help given. Some data > dput(dt_2014[1:10,]) structure(list(ï..CarID = c("GC10", "GC10", "GC10", "GC10", "GC10", "GC10", "GC10", "GC10", "GC10", "GC10"), BatteryChargeStartDate = c("16/2/2014 16:05", "16/2/2014 18:20", "17/2/2014 8:10", "18/2/2014 7:41", "18/2/2014 15:36", "18/2/2014 16:36", "18/2/2014 21:26", "19/2/2014 8:57", "19/2/2014 21:08", "20/2/2014 18:11"), BCStartTime = c("16:05", "18:20", "8:10", "7:41", "15:36", "16:36", "21:26", "8:57", "21:08", "18:11"), Year = c(2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L), Month = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), Day = c(16L, 16L, 17L, 18L, 18L, 18L, 18L, 19L, 19L, 20L), BatteryChargeStopDate = c("16/2/2014 17:05", "16/2/2014 19:00", "17/2/2014 15:57", "18/2/2014 9:52", "18/2/2014 15:39", "18/2/2014 17:36", "19/2/2014 1:55", "19/2/2014 14:25", "20/2/2014 5:17", "20/2/2014 23:20" ), BCStopTime = c("17:05", "19:00", "15:57", "9:52", "15:39", "17:36", "1:55", "14:25", "5:17", "23:20"), Year2 = c(2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L ), Month2 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), Day2 = c(16L, 16L, 17L, 18L, 18L, 18L, 19L, 19L, 20L, 20L), Starting_SoC_of_12 = c(1L, 2L, 4L, 5L, 4L, 2L, 8L, 8L, 4L, 8L), Ending_SoC_of_12 = c(11L, 11L, 12L, 8L, 4L, 10L, 12L, 12L, 12L, 12L)), row.names = c(NA, 10L), class = "data.frame") -- *Roslinazairimah Zakaria* *Tel: +609-5492370; Fax. No.+609-5492766* *Email: roslina...@gmail.com * University Malaysia Pahang Lebuhraya Tun Razak, 26300 Gambang, Pahang, Malaysia [[alternative HTML version deleted]] __ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.