A weekly count of job postings moves with the calendar as well as with hiring demand, so a reading taken straight from the series can mistake a seasonal rise for a recovery. This guide shows how to seasonally adjust a job postings time series: what the official methods ask of a series, what they cannot remove, and the comparisons that need no model at all.
The methods come from the documentation of the US Census Bureau, which maintains X-13ARIMA-SEATS, and of the Bureau of Labor Statistics (BLS), which uses it.
Why job postings have a season
Employers hire to a calendar, and a count of postings records it. The BLS adjusts the job openings series of its JOLTS survey for recurring swings that it attributes to events such as the weather, holidays and the start and end of the school year, as its JOLTS handbook describes.
The calendar also acts through the days themselves. The Census Bureau's questions and answers on seasonal adjustment describe trading-day effects, where a monthly value depends on which weekdays the month contains, and moving holidays such as Easter, which can fall in March or in April. Weekly series add a difficulty of their own. A 2021 BLS research paper reviewing programs for weekly data notes that a year can hold 52 or 53 weeks, that the week of an official holiday varies from year to year, and that some holiday effects do not occur every year.
What seasonal adjustment does, and what it cannot do
In the Census Bureau's terms, seasonal adjustment estimates the seasonal effects in a time series and removes them, so that its other movements can be seen. The series is treated as a trend-cycle, a seasonal component and an irregular component, combined by multiplication or by addition. The adjusted series is the original divided by the seasonal factors, or the original less the factors in the additive form.
Four things follow.
- The irregular stays. Only the seasonal part is taken out, so a one-week spike is still in the adjusted series.
- The factors are estimates. The Census Bureau notes that they rest on present and past experience, and that later data may show a different seasonal pattern.
- The past is revised. Adjusted values change when the original data are revised and when new observations change past factors. The BLS re-estimates the adjustment of its labour force series each year and revises the previous five years, as its seasonal adjustment methodology states.
- A change in what is counted is not a season. A count that grows because its source adds employers grows after adjustment too. Settle that in the population first, with a same-store cohort.
Revision matters for the record you keep. Market Series rows are written once for each as-of date and never rewritten. Write your adjusted series to a table of your own and store the date on which each set of factors was estimated, so that a back-test uses only the factors that existed on each date, as point-in-time data requires.
Seasonal adjustment methods: what X-13ARIMA-SEATS asks of a time series
X-13ARIMA-SEATS, the Census Bureau's program, assumes a fixed seasonal period, as monthly and quarterly series have, and needs several years of data. The Bureau of Labor Statistics requires three years before a newly published state and area employment series can be processed, and its standard options imply filters of six to ten years for a final estimate.
The Census Bureau builds, distributes and maintains X-13ARIMA-SEATS. It joins regression models with ARIMA errors, a model-based adjustment from a version of SEATS and the nonparametric X-11 adjustment, with diagnostics of the quality and stability of the result.
| What the method asks of a series | What the official documentation says |
|---|---|
| A constant seasonal period | Standard programs such as X-13ARIMA-SEATS assume one, and weekly data can have 52 or 53 weeks in a year (BLS research paper) |
| A minimum length | Three years of data are required before a newly published state and area employment series can be processed, and ten years is the default input (BLS) |
| Years on both sides of a point | The standard options imply a symmetric filter that draws on 6 to 10 years of original data for a final value (BLS methodology) |
| Length for diagnostics | Some useful diagnostics typically require at least 11 years, in some cases 14 (BLS methodology) |
| A reason to adjust | The series is seasonal, its seasonal effects can be estimated reliably and no residual seasonality is left afterwards (BLS methodology) |
| Outliers and breaks modelled | A single unusual observation, a temporary change and a level shift are handled by the modelling part of the program (BLS methodology) |
You can run on your own result the two checks the Census Bureau reviews. One is residual seasonality, judged with the QS statistic, where a p-value below 0.01 indicates that some may remain. The other is stability, judged over sliding spans and the history of revisions.
X-13, STL and BLS seasonal adjustment for employment and job postings series
The Bureau of Labor Statistics adjusts its monthly employment and job openings series with X-13ARIMA-SEATS. The two weekly unemployment insurance claims series it adjusts use other models, because a year holds 52 or 53 weeks and X-13 assumes a fixed period. STL splits a series into trend, seasonal and residual parts by loess, with the period set as a parameter.
For the monthly JOLTS series the BLS runs a concurrent adjustment: each month, new factors are computed from all the data up to and including that month. The models are additive or multiplicative, and regression with ARIMA errors improves the factors at both ends of a series and detects outliers.
Weekly data are handled apart. For weekly unemployment insurance claims the BLS has used structural time series models since the release of 14 March 2024, in place of regression models that used locally weighted regressions, and it updates the models once a year. A 2014 BLS working paper gives the reason: a year contains 52 or 53 weeks ending on a given weekday, and their position shifts from year to year, which breaks the periodic structure that X-12-ARIMA assumes. The Census Bureau lists weekly and daily series among the subjects of its time series research.
STL is the seasonal-trend decomposition by loess of Cleveland, Cleveland, McRae and Terpenning. As the NIST Dataplot reference documents it, the procedure splits a series into a trend, a seasonal and a residual part that add up to the original. Its main parameter is the period, the number of seasons in a cycle, such as 12 for monthly data, and the Dataplot command runs robustness iterations by default.
On weekly postings two choices fall to you. The period: 52 weeks are 364 days, one or two days short of a calendar year, so a period of 52 drifts against the calendar. The form: the decomposition is additive, so take logarithms first when the seasonal swing grows with the level.
How to seasonally adjust a weekly job postings series
Fix the population first, so that the count does not grow with coverage. Then test whether the same weeks run high or low each year. With several years of data, sum the counts into calendar months and adjust with X-13ARIMA-SEATS, or fit a weekly model with holiday terms. With fewer years, compare the same weeks a year apart.
- Fix the population. Count over employers observed for the whole period, and leave out postings already open when a board was first observed.
- Date openings by observation. Count each posting in the week it was first seen, so that a week is complete once it closes.
- Look for a season before you model one. Plot each year's weeks over one another. A series that rises and falls in the same weeks every year is seasonal. One that shows no such pattern fails the first BLS condition.
- Choose the route by frequency and length. Months suit X-13ARIMA-SEATS, weeks suit STL or a regression, and a short series suits the year-apart comparison.
- Model the calendar and the breaks. Give a holiday that moves between weeks a regressor of its own, and mark a level shift wherever the source or a definition changed.
- Check the result. Test for residual seasonality and compare adjustments over sliding spans.
- Keep both series. Hold the unadjusted series beside the adjusted one, with the date of each set of factors.
Two comparisons that need no model
The same weeks a year apart. Dividing a week by the same week a year earlier cancels a seasonal pattern that repeats, without estimating it. Fifty-two weeks are 364 days, so the two weeks hold the same weekdays. A holiday on a fixed date falls one weekday later each year, or two after a 29 February, and a moving holiday can land in a different week, so compare windows of four weeks or more.
A same-store cohort. Counting over the employers observed through the whole window keeps the growth of the source out of the trend. The post on same-store cohorts gives the rule and its arithmetic.
The two repair different faults: the year-apart ratio removes the season and leaves coverage growth in, and the cohort does the reverse. The ratio also measures against a single year, so whatever was unusual in last year's week passes into this year's change.
Worked example: an illustrative weekly postings series
Acme Robotics is an illustrative company, and every figure below is invented.
Assumptions:
- New postings of Acme Robotics are counted by the week, Monday to Sunday, in which each was first seen.
- Weeks 31 to 38 of this year are set against weeks 31 to 38 of last year.
- Last year's 52 weeks held 2,340 new postings, an average of 45 a week.
- No holiday falls in a different week in the two years, and the board was observed throughout both.
| Week | Last year | This year | Factor (last year / 45) | This year, adjusted | Change on the year |
|---|---|---|---|---|---|
| 31 | 40 | 44 | 0.889 | 49.5 | 10.0% |
| 32 | 38 | 42 | 0.844 | 49.7 | 10.5% |
| 33 | 36 | 40 | 0.800 | 50.0 | 11.1% |
| 34 | 34 | 38 | 0.756 | 50.3 | 11.8% |
| 35 | 52 | 58 | 1.156 | 50.2 | 11.5% |
| 36 | 56 | 62 | 1.244 | 49.8 | 10.7% |
| 37 | 54 | 61 | 1.200 | 50.8 | 13.0% |
| 38 | 50 | 55 | 1.111 | 49.5 | 10.0% |
- Unadjusted. From week 34 to week 35 this year, new postings go from 38 to 58, a rise of 52.6 per cent.
- The same step last year. It went from 34 to 52, a rise of 52.9 per cent. The jump recurs, so it is the season.
- Four weeks a year apart. Weeks 31 to 34 sum to 164 against 148 last year, a rise of 10.8 per cent. Weeks 35 to 38 sum to 236 against 212, a rise of 11.3 per cent.
- A factor from one year. Divide each of last year's weeks by the weekly average of 45, then divide this year's week by that factor. The adjusted series sits close to 50 throughout, and the step from week 34 to week 35 becomes 50.3 to 50.2, a fall of 0.2 per cent.
The adjusted value in step 4 is 45 times this year's week divided by last year's. With one year of factors, a seasonal adjustment is the year-apart comparison on another scale. Week 37 shows the consequence: its 50.8 may mean a strong week this year or a weak one last year, and a single year cannot say which. Telling a recurring season from one unusual week takes several years of the same weeks; the BLS requires at least three years of data before X-13ARIMA-SEATS can process a newly published state and area employment series.
Market index methodology for company job postings: seasonality and deduplication
A job postings index rests on three choices made before any seasonal model: which adverts count as one job, which employers are counted, and what base the index is set to. Deduplication and a fixed population come first, because a change in either shifts the level, and a model can mark a level shift without saying what caused it.
Statistics offices that build series from online adverts set these choices out. The UK Office for National Statistics (ONS) built a weekly indicator from Adzuna adverts by counting the adverts live at one point in each week and dividing by the mean weekly count of February 2020, so that the month averaged 100. From 25 March 2021 a second version partly accounted for duplicates: sets of near-identical descriptions with the same job title were found, and one example was kept for each region. The ONS released these estimates for the last time on 24 October 2024.
The ONS user guide to its Textkernel data keeps one advert of each set the provider marks as duplicates, and separates new adverts in a period from a snapshot of those live at a point in time. Eurostat's Web Intelligence Hub flags duplicates from job descriptions, location and metadata. In the ONS and Eurostat descriptions cited here we found no account of a seasonal adjustment. Jobs and Skills Australia describes one: by its methodology, each series of its monthly Internet Vacancy Index is seasonally adjusted and trended separately.
Two points carry over. New and live postings are different series: new postings are a flow and show a seasonal turn in the week it happens, while live postings are a stock that also moves with how long postings stay open. And the source decides how much there is to deduplicate, as why we read job postings from the company's own board sets out.
Year-apart comparisons on the weekly market series
The market series dataset states hiring as weekly series by industry, country and company size band, as of each Sunday, over windows of 7, 30 and 180 days. Each row carries the count, the cohort, a rate, the count over the window just before on the same cohort, the growth between the two and an index. The series are built on same-store cohorts.
The growth on a row compares a window with the one just before it, so it holds whatever season lies between the two. For the change on the year, pair each row with the row whose as-of date is 52 weeks earlier. The two windows end on Sundays 364 days apart and hold the same weekdays. Compare the rates, because each as-of date has its own cohort.
select
cur.as_of,
cur.rate as rate_now,
prior.rate as rate_year_before,
cur.rate / nullif(prior.rate, 0) - 1 as change_on_year,
cur.cohort,
prior.cohort as cohort_year_before
from market_series cur
join market_series prior
on prior.metric = cur.metric
and prior.dimension_kind = cur.dimension_kind
and prior.dimension is not distinct from cur.dimension
and prior.window_days = cur.window_days
and prior.as_of = cur.as_of - interval '364 days'
where cur.metric = 'seniority_share:senior'
and cur.dimension_kind = 'all'
and cur.window_days = 7
order by cur.as_of;The join keeps each as-of date that has a row 364 days before it. Put in the metric you follow: the catalogue that the API publishes gives the unit of each. The 30-day rows paired in the same way give a steadier reading, because the longer window absorbs a holiday that moves by a week. For X-13ARIMA-SEATS, build calendar months from Hiring Activity in the hiring dataset, which holds each company's new postings for every closed day, summed over a fixed cohort of companies. Section 9 of the methodology states the rules behind every weekly row.
Frequently asked questions
Can X-13ARIMA-SEATS seasonally adjust weekly data?
Not as a weekly series. A Bureau of Labor Statistics research paper notes that standard programs such as X-13ARIMA-SEATS assume a constant seasonal period, while weekly data can have 52 or 53 weeks in a year and holidays fall in different weeks from one year to the next. Sum daily counts into calendar months and adjust those, or use a weekly method: the structural time series models the BLS applies to weekly unemployment insurance claims, or STL with a period you set.
How many years of data does seasonal adjustment need?
In the Bureau of Labor Statistics documentation, a newly published state and area employment series needs at least three years of data before X-13ARIMA-SEATS can process it, and ten years is the default input. Its standard options imply 6 to 10 years of original data behind a final adjusted value, and some diagnostics typically require 11 years, in some cases 14. With fewer years, compare the same weeks a year apart.
Is a year-over-year comparison the same as seasonal adjustment?
Not quite. Dividing by the same period a year earlier cancels a stable seasonal pattern without estimating it, but it measures against a single year, so anything unusual in that year passes into the change. Seasonal adjustment estimates the pattern from several years and separates it from one-off movements. With only one year of factors, the two calculations give the same result on a different scale.
Why are seasonally adjusted figures revised?
The Census Bureau gives two reasons: the original data are revised, and new observations change the estimates of past seasonal factors. The Bureau of Labor Statistics re-estimates the adjustment of its labour force series each year and revises five years of adjusted data. If you adjust a series yourself, store each set of factors with the date it was estimated, so that a back-test uses only what existed on each date.
How do I compare a weekly market series with the same week last year?
Pair each weekly row with the row 52 weeks earlier. The two windows end on Sundays 364 days apart and hold the same weekdays, so the comparison carries no weekday effect. In Fokals Market Series, compare the rates, because each as-of date has its own same-store cohort, and read the cohort beside each rate to judge how far the rate can be relied on.
Should job postings be deduplicated before seasonal adjustment?
Yes. Settle which adverts are one job and which employers are counted before any seasonal model runs. A change in either moves the level of the series, and a model can mark a level shift without saying whether demand or the source caused it. Statistics built from online adverts at the ONS and at Eurostat remove or flag duplicates as part of building the series.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.
What this page says about the products it names was checked against their public documentation on 7 October 2026. Product and company names are trademarks of their owners. Fokals is not affiliated with them or endorsed by them.