My R learning notes: quick ways to aggregate minutely data into hourly data

Recently I ran into a stone wall when I tried to analyse the time series data from my first-year experiments.

In my experiments, I measured tree sap flow velocity and different environmental controls such as temperature, solar radiation, relative humidity, wind speed and soil moisture. However, these data were at different time steps. The sap flow velocity were at a hourly basis, while the environmental controls were measured at either every 10 minutes or 20 minutes. So I had to aggregate those into the same time sequences.

There are two types of aggregating data. The first is to assemble these data at every hour at each date, in order to make a correlation analysis or multiple linear regression; and the second is to average data which are measured at the same hour, disregarding the date, aiming at analyzing the 24-hour profile of the variables.

Thanks to R, I succeeded in dealing with my four-month data at just ten seconds. Now, I’d like to share the codes with you, giving my soil moisture data as an example.  🙂

  1. Making a 24-hour profile of soil moisture

Here is part of my soil moisture data (unit: VW%) at my Treatment 2 plot. I measured the soil moisture at two depth: Shallow ( at the 20 cm depth), and Deep (at the 40 cm depth).

Fig. 1 Example of initial soil moisture data

(1) Save the excel file as *.csv, and import it into R Studio. In my case, I input my data as data frame named soilt2. Please remember to change the data type of Datetime column as Datetime, and turn Shallow column and Deep colunm as numeric.

Fig. 2 Input soil moisture dataset

(2) Input code:

soilt2$Datetime1 <- as.POSIXlt(soilt2$Datetime)$hour  ### This will add a new colunm named Datetime1 in the soilt2 dataset. Datetime1 displayed below showed that only the hour was extracted from Datetime.

Fig. 3 the added new colunm Datetime1 is showed on the right of the table.

soilt2 <- aggregate(cbind(Shallow, Deep) ~ Datetime1, data=soilt2, FUN=mean) ### This averaged Shallow and Deep data into hourly data,  regardless of the date. In my case, I changed my original dataset. If you don’t want to make change of the original dataset, please give a new name to your new dataset, such as soilt3.

Fig. 4 The changed soilt2 data frame.

Done! Yay!

2. Assemble the data at each hour at each date.

(1) Import the dataset (the same as the first method).

(2) Input the following code

soilt2$Datetime2 <- droplevels(cut(soilt2$Datetime, breaks=”hour”)) ### This added a new colunm named Datetime2 in soilt2, which includes the date and the hour extracted from Datetime column.

Fig. 5 The added new column Datetime2 is showed on the right of the table.

soilt3 <- aggregate(cbind(Shallow, Deep) ~ Datetime2, data=soilt2, FUN=mean) ### This calculate the mean of data in each hour at each date.

Fig. 6 The new soilt3 data frame.

Yay again! Done!

If you want to output these data into excel, you can load package (xlsx), and using the code of write.xlsx(  ).  For example, I use the following code:

write.xlsx(soilc1, “c:/Users/Yi Wang/Desktop/soilc1.xlsx”)

There are definitely other ways to aggregate the data, but the codes that I put on this blog, in my opinion, is the most simple code. If you disagree with me, or you’d like to share your code, please feel free to leave your comments.

Thank you for reading!

May, 04, 2017



58 thoughts on “My R learning notes: quick ways to aggregate minutely data into hourly data

  1. Hi there,

    Thanks for your code.
    Quick question. Do you know why when I input your line:
    soilt2$Datetime2 <- droplevels(cut(soilt2$Datetime, breaks=”hour”))
    which translates in my code to:
    Site27_summerBB$datetime2 <- droplevels(cut(Site27_summerBB$datetime, breaks=”hour”))

    I get:
    Error: unexpected input in "Site27_summerBB$datetime2 <- droplevels(cut(Site27_summerBB$datetime, breaks=”"

    It appears that it doesn't like "hour"

    Many Thanks,


    1. Oh, totally realized why as soon as I posted it typical! haha

      change from this:
      soilt2$Datetime2 <- droplevels(cut(soilt2$Datetime, breaks=”hour”))

      to this:
      soilt2$Datetime2 <- droplevels(cut(soilt2$Datetime, breaks='hour'))


  2. Hi Yi

    Thanks for sharing. I have some half-yearly electricity demand data and I wish to convert it into time series object. The data is between 2014-2017, therefore, includes the leap year 2016. I am not sure how to convert it to a time series object

    1. Hi Heidi,

      Thanks for reading the post! The gap should not be an issue if u use the codes in this post. Could you please let me know how you would like to convert?

  3. Thank you for this very helpful post!

    When I want to break into hour: data.merged_wake_sleep$Datetime2 <- droplevels(cut(data.merged_wake_sleep$absolute_Date, breaks= 'hour'))

    I get the following error message: Error in cut.default(data.merged_wake_sleep$absolute_Date, breaks = "hour") :
    'x' must be numeric.

    Anyone familiar with this?


    1. Hi Lea,

      Thanks for reading it! Maybe try this:

      data.merged_wake_sleep$absolute_Date1 <- as.numeric(data.merged_wake_sleep$absolute_Date) # turn your raw data into numeric data data.merged_wake_sleep$Datetime2 <- droplevels(cut(data.merged_wake_sleep$absolute_Date1, breaks= 'hour')) Please let me know if it works! Thank you!

  4. Hello,

    Thank you for this very helpful article!

    I came across the same issue as Lea, and tried to use the fix suggested but received the following error message:
    Error in breaks + 1 : non-numeric argument to binary operator

    When I take a look at my table, the new column I created with the as.numeric from the date/time column was simply numbered 1-12874 (number of values), rather than keeping any date/time format.

    Any ideas as to why this might be?

  5. This is really a extremely beneficial read for me, Have to admit you might be 1 in the most effective bloggers and my seotons I ever saw.Thanks for posting this informative article.

  6. Thanks, A Lot…
    Please don’t stop your Blogging and continue posting such solution..
    It helps a lot.

  7. Thank you so much for the article ! Simple, efficient and very clear. After hours spent to look for a solution, your article was a great help for me.

  8. Your writing is perfect and complete. However, I think it will be more wonderful if your post includes additional topics that I am thinking of. I have a lot of posts on my site similar to your topic. Would you like to visit once? keonhacai

  9. This is very sharp and straight to the point. Been struggling with the complicated posts on stack overflow. Thank you for this!

  10. Looking to upgrade your smart device game? Look no further than our comprehensive list of the Best Smart Accessories! From smartwatches to Bluetooth headphones, we’ve got you covered with the latest and greatest in tech accessories. Discover the ultimate add-ons that will take your device experience to the next level. Don’t settle for mediocre accessories – read our guide and step up your smart device game today!
    t500 smart watch price in pakistan

  11. At World Counseling, we believe in the power of personal growth, self-discovery, and well-being. Our mission is to provide unique and effective counseling services to individuals seeking support, guidance, and transformation.

  12. We have thousands of happy customers whom we have helped with our experience and professional team. Nothing is worth more than our relationship of trust with our well-esteemed customers, so our priority is to provide risk-free performance with high satisfaction. The Dream Cool AC Service team is highly equipped and ensures top-notch work delivery.
    AC installation in dubai

  13. Nice post. I found this to be an informative and interesting post, so I think it is very useful and knowledgeable. I am glad to read this post and hope your next article is are so useful for me so you are meeting in the next process for more information click this link below: –
    calculating wpm typing


  14. comprar carta de conduçao preço, comprar carta de condução verdadeira, comprar carta de conduçao, comprar carta de condução lisboa, comprar carta de condução legal, comprar carta de condução, carta de condução comprar, comprar carta de conduçao, comprar carta de condução em Portugal, comprar carta, comprar carta de condução portugal, comprar carta de condução online, comprar a carta de condução, carta de condução, comprar carta de carro, imt carta de condução, comprar carta de condução no porto


  15. gdzie mozna kupic prawo jazdy z wpisem do rejestru, kupić prawo jazdy, legalne prawo jazdy do kupienia, kupię prawo jazdy, jak załatwić prawo jazdy, bez egzaminu, jak kupić prawo jazdy, czy można kupić prawo jazdy, legalne prawo jazdy do kupienia 2022, pomogę zdać egzamin na prawo jazdy, prawo jazdy bez egzaminu, gdzie kupić prawo jazdy bez egzaminu, gdzie kupić prawo jazdy na lewo, jak kupić prawo jazdy w niemczech, gdzie kupic prawo jazdy legalnie, kupić prawo jazdy b


  16. sportbootfĂźhrerschein binnen und see, sportbootfĂźhrerschein binnen prĂźfungsfragen, sportbootfĂźhrerschein binnen kosten, sportbootfĂźhrerschein binnen online, sportbootfĂźhrerschein binnen wo darf ich fahren, sportbootfĂźhrerschein binnen berlin, sportbootfĂźhrerschein binnen segel, sportbootfĂźhrerschein kaufen, sportbootfĂźhrerschein kaufen erfahrungen, sportbootfĂźhrerschein kaufen schwarz, sportbootfĂźhrerschein see kaufen, sportbootfĂźhrerschein binnen kaufen, sportbootfĂźhrerschein see kaufen ohne prĂźfung, bootsfĂźhrerschein kaufen, bootsfĂźhrerschein kaufen polen, bootsfĂźhrerschein kaufen erfahrungen, bootsfĂźhrerschein online kaufen, bootsfĂźhrerschein tschechien kaufen.


  17. acheter permis de conduire en ligne, acheter un permis de conduire belge, achat permis de conduire, acheter un permis de conduire, acheter permis de conduire belgique, acheter le permis de conduire, permis de conduire acheter, faux permis de conduire belge, j’ai acheter mon permis de conduire sur internet, acheter son permis de conduire belgique, acheter son permis de conduire lĂŠgalement, acheter un vrai permis de conduire, acheter permis moto a2, acheter permis moto ĂŠtranger, Acheter permis de conduire enregistrĂŠ, acheter permis de conduire enregistrĂŠ en prĂŠfecture forum, permis de conduire lĂŠgalement enregistrĂŠ.


  18. lkw fĂźhrerschein kaufen legal, fĂźhrerschein kaufen ohne vorkasse, registrierten fĂźhrerschein kaufen erfahrungen, fĂźhrerschein kaufen erfahrungen, fĂźhrerschein kaufen ohne prĂźfung KĂśln, fĂźhrerschein kaufen Ăśsterreich, fĂźhrerschein kaufen ohne prĂźfung Ăśsterreich, fĂźhrerschein kaufen ohne prĂźfung Ăśsterreich, fĂźhrerschein kaufen in Ăśsterreich, fĂźhrerschein kaufen Frankfurt, fĂźhrerschein kaufen schweiz.


  19. Comprare patente registrata presso Motorizzazione civile (DMV)? La decisione di comprare patente online in Italia , comprare una patente, patente originale, comprare patente c, acquisto patente b, comprare patente prezzo, compro patente, acquistare patente b, dove posso comprare la patente b, compra patente online, comprare patente b online, comprare la patente a napoli, dove si può comprare la patente, quanto costa comprare la patente, comprare patente di guida, comprare patente senza.


Leave a Reply

Your email address will not be published. Required fields are marked *