R Time series Object ts () Date of minimum and maximum

I would like to find the date of the minimum and maximum values ​​in the object R ts() . I tried the functions which.min and which.max , but they only return the line number. I would like to print the actual date. Thanks.

 data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12)) data which.min(data) which.max(data) 
+7
r time-series
source share
4 answers

Here's how you find the year and month of the minimum and maximum values ​​in the data:

 > data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12)) > data Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2012 0.18 -0.07 -0.77 1.23 -0.97 1.20 -1.41 1.39 -0.72 -0.94 0.28 0.97 2013 -0.86 -0.57 -0.16 -1.24 -0.35 -0.06 0.78 1.32 1.80 -0.51 -1.91 1.14 2014 -0.51 1.21 0.14 0.30 1.18 -0.32 -0.92 -0.46 -0.97 -0.94 -1.56 -0.63 2015 0.13 0.93 -1.45 1.97 0.04 0.55 0.45 0.13 1.14 0.27 0.15 -1.39 2016 0.68 2.16 -1.56 -0.44 1.07 1.27 1.01 -2.93 -0.19 -0.70 1.44 0.09 

Corresponding Minimum Date

 > data_min_value <- data[which.min(data)] > data_min_value [1] -2.93 > data_min_value_time <- time(data)[which.min(data)] > data_min_value_time [1] 2016.583 > data_min_value_year <- floor(time(data)[which.min(data)]) > data_min_value_year [1] 2016 > data_min_value_month <- (time(data)[which.min(data)] %% 1)*12 > data_min_value_month [1] 7 > data_min_value_month_abb <- month.abb[(time(data)[which.min(data)] %% 1)*12+1] > data_min_value_month_abb [1] "Aug" 

Date of maximum value that you get in a similar way

 > data[which.max(data)] [1] 2.16 > floor(time(data)[which.max(data)]) # Year [1] 2016 > month.abb[(time(data)[which.max(data)] %% 1)*12+1] # Abbreviation of month [1] "Feb" 

The following is a brief description of the useful features that were used in the examples above:

 > floor(2016.563) # find out the integer part on the number [1] 2016 > 2016.563 %% 1 # find out the fractional part on the number [1] 0.563 > month.abb[0.563*12+1] # find out the abbreviation of the month name [1] "Jul" 
+4
source share

This is how I understand this, but I'm not familiar with ts , and I'm sure there is a better option.

To get the date from the max / min position, you can index the object created with time on ts . For example: time(data)[which.max(data)] ; for which.min .

Then, to convert this to the corresponding year (simple) and monthly (complex) index, I usually create this function:

 numyear2monthyear <- function(x){ c(trunc(x), # entire part = year round((x-floor(x))*12 + 1)) # decimal part * 12 + 1 (Jan=0) = Month } 

Here is an example:

 set.seed(123) # for the sake of reproducibility data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12)) data Jan Feb Mar Apr May Jun Jul Aug 2012 -0.56 -0.23 1.56 0.07 0.13 1.72 0.46 -1.27 2013 0.40 0.11 -0.56 1.79 0.50 -1.97 0.70 -0.47 2014 -0.63 -1.69 0.84 0.15 -1.14 1.25 0.43 -0.30 2015 0.55 -0.06 -0.31 -0.38 -0.69 -0.21 -1.27 2.17 2016 0.78 -0.08 0.25 -0.03 -0.04 1.37 -0.23 1.52 Sep Oct Nov Dec 2012 -0.69 -0.45 1.22 0.36 2013 -1.07 -0.22 -1.03 -0.73 2014 0.90 0.88 0.82 0.69 2015 1.21 -1.12 -0.40 -0.47 2016 -1.55 0.58 0.12 0.22 which.min(data) [1] 18 which.max(data) [1] 44 numyear2monthyear(time(data)[which.max(data)]) [1] 2015 8 numyear2monthyear(time(data)[which.min(data)]) [1] 2013 6 

And usually I turn this into another convenient function, for example:

 extrema_dates <- function(ts){ ts_min_date <- numyear2monthyear(time(ts)[which.min(ts)]) ts_max_date <- numyear2monthyear(time(ts)[which.max(ts)]) list(min=min(ts), min_year=ts_min_date[1], min_month=ts_min_date[2], max=max(ts), max_year=ts_max_date[1], max_month=ts_max_date[2]) } > extrema_dates(data) $min [1] -1.97 $min_year [1] 2013 $min_month [1] 6 $max [1] 2.17 $max_year [1] 2015 $max_month [1] 8 

I hope it solves your problem (and would be glad to see the best option for this).

+5
source share

This gives an object of class yearmon for a minimum. The same with which.max will work for maximum.

 library(zoo) imin <- which.min(data) tmin <- time(as.zoo(data))[imin] tmin ## [1] "Dec 2016" 

as.integer(tmin) , cycle(tmin) and as.Date(tmin) will indicate the year, month (as a number from 1 to 12) and the Date object using the 1st of the month, respectively.

Alternatively, time(data)[imin] , as.integer(time(data))[imin] and cycle(data)[imin] will give time as year + fraction, year as integer and month. These three do not use any packages.

+3
source share

My favorite tool for time series is xts , and ts objects are translated cleanly:

 library(xts) x = as.xts(data) 

Outputs:

 > min(index(x)) [1] "Jan 2012" > max(index(x)) [1] "Dec 2016" 
+3
source share

All Articles