简体   繁体   中英

Divide time-series data into weekday and weekend datasets using R

I have dataset consisting of two columns (timestamp and power) as:

 str(df2)
'data.frame':   720 obs. of  2 variables:
 $ timestamp: POSIXct, format: "2015-08-01 00:00:00" "2015-08-01 01:00:00" " ...
 $ power    : num  124 149 118 167 130 ..

This dataset is of entire one month duration. I want to create two subsets of it - one containing the weekend data, and other one containing weekday (Monday - Friday) data. In other words, one dataset should contain data corresponding to saturday and sunday and the other one should contain data of other days. Both of the subsets should retain both of the columns. How can I do this in R?

I tried to use the concept of aggregate and split, but I am not clear in the function parameter (FUN) of aggregate, how should I specify a divison of dataset.

You can use R base functions to do this, first use strptime to separate date data from first column and then use function weekdays . Example:

df1<-data.frame(timestamp=c("2015-08-01 00:00:00","2015-10-13 00:00:00"),power=1:2)
df1$day<-strptime(df1[,1], "%Y-%m-%d")
df1$weekday<-weekdays(df1$day)
df1
 timestamp              power   day      weekday
 2015-08-01 00:00:00     1   2015-08-01  Saturday
 2015-10-13 00:00:00     2   2015-10-13  Tuesday

Initially, I tried for complex approaches using extra libraries, but at the end, I came out with a basic approach using R.

    #adding day column to existing set 
    df2$day <- weekdays(as.POSIXct(df2$timestamp))    
    # creating two data_subsets, i.e., week_data and weekend_data
    week_data<- data.frame(timestamp=factor(), power= numeric(),day= character())
    weekend_data<- data.frame(timestamp=factor(),power=numeric(),day= character())
    #Specifying weekend days in vector, weekend
    weekend <- c("Saturday","Sunday")
    for(i in 1:nrow(df2)){
      if(is.element(df2[i,3], weekend)){
        weekend_data <- rbind(weekend_data, df2[i,])
      } else{
        week_data <- rbind(week_data, df2[i,])
      }
    }

The datasets created, ie, weekend_data and week_data are my required sub datasets.

Building on top of @ShruS example:

df<-data.frame(timestamp=c("2015-08-01 00:00:00","2015-10-13 00:00:00", "2015-10-11 00:00:00", "2015-10-14 00:00:00"))
df$day<-strptime(df[,1], "%Y-%m-%d")
df$weekday<-weekdays(df$day)
df1 = subset(df,df$weekday == "Saturday" | df$weekday == "Sunday")
df2 = subset(df,df$weekday != "Saturday" & df$weekday != "Sunday")

> df
            timestamp        day   weekday
1 2015-08-01 00:00:00 2015-08-01  Saturday
2 2015-10-13 00:00:00 2015-10-13   Tuesday
3 2015-10-11 00:00:00 2015-10-11    Sunday
4 2015-10-14 00:00:00 2015-10-14 Wednesday

> df1
            timestamp        day  weekday
1 2015-08-01 00:00:00 2015-08-01 Saturday
3 2015-10-11 00:00:00 2015-10-11   Sunday

> df2
            timestamp        day   weekday
2 2015-10-13 00:00:00 2015-10-13   Tuesday
4 2015-10-14 00:00:00 2015-10-14 Wednesday

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM