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. 🙂
-
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
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,
Jenni
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'))
Thanks
Hi Jenni, thank you for reading! I am glad to know that the problem has fixed 😉
Don’t forget to load library(plyr)!
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
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?
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?
Best,
Lea
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!
Thank you so much!
It worked :).
Best,
Lea
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?
Thank you!! I really appreciate the simplicity!!
This was really easy to understand. Thanks! However, how would you do this across multiple days?
I have the same question, actually! Did you figure it out, Colleen?
Thanks,
Kim
I have a 2 years 30 minutes data, it contains other factors too. How do I convert it to hourly?
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.
Thanks, A Lot…
Please don’t stop your Blogging and continue posting such solution..
It helps a lot.
What a nice article i found , i was looking it for a long time , i been searching it for so long now that i found out really help me.
We must be more passionate about everything espeCially when it comes in our nature and environment check this out also >>
카지노사이트
I read that Post and got it fine and informative. Please share more like that..
토토사이트
I will bookmark your web site and take the feeds additionally…I am satisfied to search out a lot of helpful information right here in the publish, we want work out more techniques on this regard, thanks for sharing.
파워볼사이트
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.
I searched a lot on this topic and finally found it. I read your post and was very impressed. We visit this site frequently to appreciate your comments. keo nha cai
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
This is very sharp and straight to the point. Been struggling with the complicated posts on stack overflow. Thank you for this!
What a nice article i found , i was looking it for a long time , i been searching it for so long now that i found out really help me. 토토사이트
I read that Post and got it fine and informative. Please share more like that.. 메이저사이트
Thanks, A Lot…
Please don’t stop your Blogging and continue posting such solution.. 먹튀검증
I read a good article. It was very helpful and provided a lot of reference. https://mt-tiger.com/
Tanks For Sharing… I like Your Websaite… My Web Jual Fire Tube Boiler Horizontal
I enjoyed reading a good article. It was very helpful and gave me some good information. I will visit you often.
keep publishing such info. technology entrepreneur posts
I have never heard of this information before. Thank you so much for sharing!
junk removal palm beach fl
So lucky to come across your excellent blog. Your blog brings me a great deal of fun. Good luck with the site.
decks raleigh nc
Interesting read, can i share this on my blog?
keep publishing such info.MP4Moviez
good work well thnaks for this post
good owrk
This is my first-time visit to your blog and I am very interested in the articles that you serve. Provide enough knowledge for me.
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
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.
https://worldcounsling.com/
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
Everything you love is in faj.ae Shop. Discover and buy Electrical, Electronics, Home Appliances, AC,
water heater
Thanks for sharing very excellent information. https://blogsyo.com
This is a great post. I like this topic. This site has lots of advantages. I found many interesting things on this site. It helps me in many ways. Thanks for posting this again.
dmw-scholarship/
Rohit
All the content you mentioned in the post is too good and can be very useful. I will keep it in mind, thanks for sharing the information keep updating, looking forward to more posts. Thanks
aditya-birla-scholarship/
ROHIT
I am really obliged that I have found this sort of blog I had been searching for,
digital india login 2022-23 servuces/
ROHIT
All the content you mentioned in the post is too good and can be very useful. I will keep it in mind, thanks for sharing the information keep updating, looking forward to more posts. Thanks
aadhar-card-images-biomedical-document/
ROHIT
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
ROHIT
I am really obliged that I have found this sort of blog I had been searching for,
irs stilmulus check tracker
ROHIT
Kopen een echt en geregistreerd rijbewijs van onze website zonder examens te schrijven of de oefentest te doen. alles wat we nodig hebben zijn uw gegevens en deze zouden binnen de komende acht dagen in het systeem worden geregistreerd. rijbewijs kopen belgië, rijbewijs kopen belgie, rijbewijs kopen in nederland, rijbewijs b belgie, rijbewijs kopen met registratie.
https://rijbewijskopenbetrouwbaar.com/