scroll · 2026-06-02 · ~5 min · live data

When the city sleeps

Different parts of Philly call about different things at 2 AM. The hour-of-day fingerprint of 1297k 311 calls since 2024, neighborhood by neighborhood.

Philadelphia's 311 calls don't arrive evenly through the day. Looking at the citywide pattern, only 4% of calls land between midnight and 6 AM. The chart on the right shows the full 24-hour distribution.

The peak overnight hour citywide is 12 AM (19,204 calls); morning ramps up sharply around 11 AM as the city wakes up and starts noticing things. The shape is what you'd expect — but it's a citywide *average*, and averages hide the texture.

Now we fly to Center City. The map zooms in; the sparkline morphs to this neighborhood's 24-hour distribution. Of 47,606 calls in the window, 10% arrive between midnight and 6 AM — 150% above the citywide rate.

The peak overnight hour is 12 AM (1,516 calls). Whether that's noise, dumping, or something else — the chart can't say; it can only point at which hour something woke a resident up enough to file a 311.

Now we fly to North Philly. The map zooms in; the sparkline morphs to this neighborhood's 24-hour distribution. Of 114,150 calls in the window, 5% arrive between midnight and 6 AM — 25% above the citywide rate.

The peak overnight hour is 12 AM (2,063 calls). Whether that's noise, dumping, or something else — the chart can't say; it can only point at which hour something woke a resident up enough to file a 311.

Now we fly to South Philly. The map zooms in; the sparkline morphs to this neighborhood's 24-hour distribution. Of 80,570 calls in the window, 9% arrive between midnight and 6 AM — 125% above the citywide rate.

The peak overnight hour is 12 AM (2,664 calls). Whether that's noise, dumping, or something else — the chart can't say; it can only point at which hour something woke a resident up enough to file a 311.

Now we fly to Northeast Philly. The map zooms in; the sparkline morphs to this neighborhood's 24-hour distribution. Of 103,777 calls in the window, 7% arrive between midnight and 6 AM — 75% above the citywide rate.

The peak overnight hour is 12 AM (2,573 calls). Whether that's noise, dumping, or something else — the chart can't say; it can only point at which hour something woke a resident up enough to file a 311.

map loads on scroll…

Citywide · 1,297,473 calls · since 2024-01-01

12 AM 6 AM noon 6 PM 11 PM

View underlying data

24-hour call counts per neighborhood. Each column is one beat in the story.

HourCitywideCenter CityNorth PhillySouth PhillyNortheast Philly
00:0019,2041,5162,0632,6642,573
01:0011,3771,0611,1981,6951,764
02:008,8288971,0081,3581,451
03:005,706600731927984
04:003,401333472541568
05:002,256193298291364
06:001,361111268151213
07:001,220136185141201
08:001,477173222155231
09:002,124229301263383
10:004,554640587686902
11:009,4801,1711,3131,5941,782
12:0065,0963,0406,6034,6105,675
13:00115,9224,04110,3726,9488,473
14:00137,5324,16811,6357,4109,776
15:00136,0904,02111,4497,2649,640
16:00139,2563,78411,6067,0759,750
17:00136,9663,70811,0806,8089,466
18:00129,7483,51010,3556,3859,080
19:00126,3093,57710,1136,1619,203
20:0097,1233,3068,3335,4727,438
21:0065,4942,8336,2034,7555,758
22:0043,2802,4534,2393,8394,388
23:0033,6692,1053,5163,3773,714
Total1,297,47347,606114,15080,570103,777

Data Sources

Primary dataset: Philadelphia 311 service-and-information requests (public_cases_fc) via phl.carto.com. All categories combined, calls since 2024-01-01. Frozen at deploy (2026-06-02).

Queries: citywideHourOfDaySql('2024-01-01') for the citywide beat, plus byHourOfDayForZipsSql(zips, '2024-01-01') for each of the four neighborhood beats (Center City, North Philly, South Philly, Northeast Philly). Defined in src/lib/data/datasets/philly-311.ts. Neighborhood → zip lookup: src/lib/data/static/philly/zip-to-neighborhood.json.

Methodology & caveats: Per-beat zip lists are aggregated server-side so each neighborhood's hour distribution averages across its constituent zips, not any single zip's idiosyncrasy. "Overnight" = midnight to 6 AM (hours 0–5 inclusive); peak hours come from peakInRange over the same dense 24-hour array shown in the sparkline. Map flyTo respects prefers-reduced-motion via maplibre-gl's built-in reduce-fallback.