I want to

  1. categorize a large number of time series into non-seasonal and seasonal
  2. divide the seasonal ones into a small number of subgroups by type of seasonality

Are there any formal definitions/taxonomies of seasonality out there?

Or is this an "I know it when I see it" kind of phenomenon (to paraphrase Justice Potter Stewart)?

I don't want to reinvent the wheel here, so I am curious if there is existing wisdom on how to do this well.

Here are a couple of off-the-cuff ideas:

  • A simple concentration-index definition could be the sum of the squared shares of the total for each time unit: $$\sum_{t=1}^{T} \left(\frac{y_t}{\sum_{t=1}^{T}y_t} \right)^2 $$

    When that sum exceeds some threshold, a series would be considered seasonal.

  • A more complicated approach would be to decompose a time series into trend, seasonal, cyclical, and idiosyncratic components and calculate the fraction of total variation due to the seasonal part. A series would be seasonal if that fraction exceeds some threshold.

  • The next step would be to cluster the shares or the seasonal components into groups that are similar.

  • 1
    $\begingroup$ Another idea could be to use a Fourier transform to identify the presence of some dominant frequencies. You could define seasonal as having a Fourier coefficient above some threshold and cluster using these coefficients. $\endgroup$
    – Adam Kells
    Sep 23, 2021 at 18:53
  • $\begingroup$ @AdamKells This is helpful. If you know of any examples of this approach out there (journals, books, or websites), please add a link. $\endgroup$
    – dimitriy
    Sep 23, 2021 at 19:33
  • $\begingroup$ Spectral analysis and metrics of power in the frequencies that you consider to be seasonality, e.g. wave length between 12-24 months. Power is measured in watts per herz, so you can integrate and compare to total power $\endgroup$
    – Aksakal
    Sep 23, 2021 at 19:46

1 Answer 1


Decomposing the time series into trend, seasonal, cyclical, and idiosyncratic components may be easier than you think.

Suppose our dates are in years since 2020, so that $t=0.0$ is January 1, 2020, $t=1.0$ is January 1, 2021, and $t=1.5$ is July 1, 2021.

Trend and Seasonality

We can analyze seasonality with sines and cosines, which is especially simple when the maximum and minimum seasons are six months apart. We get both trend and seasonality for such a time series $y_t$ using a linear regression of the form

$$y_t = a + bt + c\sin(2\pi t) + d\cos(2\pi t)$$

A significant $b$ in the equation can show significant trend, and a significant $c$ or $d$ can show significant seasonality, if the model is not invalidated by autocorrelation, heteroskedasticity, multicollinearity, or nonnormality. By using a two-argument arctan function like atan2 in R or math.atan2 in Python), we can also rewrite the equation as $$y_t = a + bt + \sqrt{c^2+d^2}\cos(2\pi t - \arctan(c,d))$$

Then the peak month in this model is roughly $\text{round}(1/2+6\arctan(c,d)/\pi)$, and we can classify the seasonalities by those months.

Cyclicality and More Terms

For a cycle starting at time $0$, we can detect a combination of trend, seasonality and cyclicality by adding the term

$$e(1-\cos(2\pi t/p))$$

to the regression, where $e$ is the coefficient to be fit, and $p$ is the period of the cycle (in years). E.g. we can model the current solar cycle, which has an estimated period of $p=11$ years, and started with minimal sunspots at the beginning of 2020.

We can extend this model easily for cyclicality starting at other times, for trends that speed up or slow down, and for seasonality where the maximum and minimum have different shapes. If this gives us more significant coefficients, then some clustering analysis may be useful.

Meanwhile, the basic analysis above is practical and can already give some insight.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.