Sample dataset · CC0
Weather with a season in it.
Ten cities, one row per city per day, two years. Temperature follows a sine wave on the day of the year around each city's own baseline, so summer is warm in the north and, in Sydney, in the other half of the year.
7 columns · 100 or 1,000 rows as a file · up to 1,000,000 rows generated here · CSV, JSON, JSONL, Excel, Parquet
Take a file
One thousand rows is a hundred dates across all ten cities. If you want the full two years at daily resolution you want the 10,000-row generation below, which gives every city a thousand days.
| Format | Small | Standard |
|---|---|---|
| CSV | 100 rows (4.3 KB) | 1,000 rows (42.6 KB) |
| JSON | 100 rows (12.3 KB) | 1,000 rows (122.6 KB) |
| JSONL | 100 rows (12.0 KB) | 1,000 rows (119.6 KB) |
| Excel | 100 rows (16.7 KB) | 1,000 rows (93.4 KB) |
| Parquet | 100 rows (2.8 KB) | 1,000 rows (11.8 KB) |
Ten thousand rows is the honest size
Ten thousand rows is the natural size for this dataset: ten cities times a thousand dates. The larger sizes are useful mainly as a stress test for multi-series charting.
The first eight rows
The first eight rows of the 1,000-row file. The ten cities repeat in a fixed order within each date.
| date | city | temp_c | humidity_pct | wind_kph | precip_mm | condition |
|---|---|---|---|---|---|---|
| 2025-01-01 | Seattle | -0.9 | 58 | 2.1 | 0.0 | Partly cloudy |
| 2025-01-01 | Austin | 9.7 | 97 | 18.3 | 0.0 | Partly cloudy |
| 2025-01-01 | Boston | 0.2 | 63 | 25.2 | 5.2 | Rain |
| 2025-01-01 | Denver | -2.4 | 73 | 14.6 | 0.0 | Partly cloudy |
| 2025-01-01 | Chicago | -0.4 | 56 | 4.3 | 0.0 | Cloudy |
| 2025-01-01 | Miami | 16.8 | 42 | 19.9 | 0.0 | Partly cloudy |
| 2025-01-01 | London | -1.8 | 51 | 5.1 | 3.4 | Rain |
| 2025-01-01 | Berlin | -3.4 | 61 | 16.0 | 0.0 | Partly cloudy |
Seven columns, and what each one holds
| Column | Type | What it holds | Example |
|---|---|---|---|
| date | date | Observation date. Ten rows share each date, one per city. | 2025-01-01 |
| city | text | One of ten cities, cycling in a fixed order. | Seattle |
| temp_c | decimal | Mean temperature in Celsius. Follows a sine wave on day of year around the city's own baseline. | -0.9 |
| humidity_pct | integer | Relative humidity, 28 to 98 percent. | 58 |
| wind_kph | decimal | Mean wind speed in km/h, one decimal. | 2.1 |
| precip_mm | decimal | Rainfall in millimetres. Zero on most days, with a long tail. | 0.0 |
| condition | text | Clear, Partly cloudy, Cloudy, Rain or Storm. Agrees with precip_mm on every row. | Partly cloudy |
What it models
A daily observation table: for each city, on each date, a mean temperature, humidity, wind, rainfall and a summary condition. It is the classic long-format time series, with a date column, a series column and several measures, which is the shape every charting tool claims to handle and which many handle badly once there are ten series.
The ten cities are Seattle, Austin, Boston, Denver, Chicago, Miami, London, Berlin, Tokyo and Sydney. Each has its own annual baseline temperature and its own wetness, so Miami sits warm in the chart while Seattle sits cool and rains on you.
Why the seasonal curve matters
Temperature is the city's baseline plus eleven degrees times a sine wave on the day of the year, plus a few degrees of daily noise. The wave is phase-shifted so the peak lands in mid-July, which puts summer where the northern hemisphere expects it.
Sydney's coefficient is negated. Its curve is the mirror image, peaking in January and troughing in July. That single detail is what makes this file useful for testing a chart: a naive average temperature by month across all ten cities produces a nearly flat line, and working out why is a genuinely instructive twenty minutes.
Most generated weather data draws temperature uniformly between two bounds. It looks fine in a table and it is worthless in a chart, because there is no signal in it at all. Here there is signal, noise and a deliberate counterexample.
Rain and the condition column
precip_mm is zero on most days and drawn from a squared distribution when it does rain, so the tail is long and heavy days are rare. The condition column is derived from it afterward: above twelve millimeters is Storm, above a small threshold is Rain, and dry days split between Cloudy, Partly cloudy and Clear.
Because condition is derived rather than drawn, it never contradicts the number beside it. You will not find a row that says Clear next to eighteen millimeters of rain, which happens in sample weather data more often than you would hope and makes any teaching example built on it fall apart in front of a class.
What people use it for
- Multi-series time series charts, with ten series and a real legibility problem.
- Seasonality: a sine wave you can recover, and one city that runs the other way.
- Teaching why averaging across groups can erase the signal you were looking for.
- Zero-inflated distributions, using precip_mm, which is zero on most days.
- Checking that a derived categorical column and its source number stay consistent.
Open it somewhere useful
This is the file to hand to a chart builder when you want ten series on one axis and need to know whether the legend survives.
License, and the people in it
This dataset is dedicated to the public domain under CC0 1.0. Put it in a course, a paid product, a test suite, a bug report, a screenshot, a conference talk or a book. There is nothing to ask for, nothing to sign and no attribution required. A link back is welcome and is not a condition.
There are no people in this file. The readings are generated from a seasonal model, not scraped from a weather service, so nothing here is anybody's proprietary observation record and none of it is accurate for a real date or place.
Questions people ask about this file
Is Sydney's season really reversed?
Yes, and it is the most useful thing in the file. Its seasonal coefficient is negated, so its temperature curve peaks in January while the other nine peak in July. Average all ten cities by month and the seasonal signal nearly cancels, which is a small, memorable lesson about aggregating across groups that do not share a shape.
Does the condition column agree with the rainfall?
Always, because it is derived from it. Over twelve millimeters is Storm, anything above a small threshold is Rain, and dry days are split between Cloudy, Partly cloudy and Clear. The condition is computed after the number, so the two can never disagree the way they do when both are drawn independently.
Why does the 1,000-row file only cover a hundred dates?
Because all ten cities report on every date, so a thousand rows is a hundred dates. Every size still spreads across the same two-year window, which means the 1,000-row file samples a hundred dates spread across two years rather than a hundred consecutive days. For daily resolution, generate 10,000 rows and every city gets a thousand days.
Is this real weather data?
No. It is generated from a seasonal model with per-city baselines, not scraped from an observation network, so it is not accurate for any real date or place and should not be presented as if it were. It is built to have the statistical shape of weather data, which is what a chart or a forecasting exercise needs from a sample file.
More sample data
All twenty datasets · Messy files and every other format · Build your own schema