scroll · 2026-05-13 · ~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 1278k 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,177 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,228 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 112,429 calls in the window, 5% arrive between midnight and 6 AM — 25% above the citywide rate.

The peak overnight hour is 12 AM (2,061 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 79,868 calls in the window, 9% arrive between midnight and 6 AM — 125% above the citywide rate.

The peak overnight hour is 12 AM (2,662 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 102,479 calls in the window, 8% arrive between midnight and 6 AM — 100% above the citywide rate.

The peak overnight hour is 12 AM (2,570 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.

Citywide · 1,277,513 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,1771,5162,0612,6622,570
01:0011,3531,0561,1971,6931,763
02:008,8118941,0071,3581,451
03:005,690600730927981
04:003,394333472541568
05:002,253193297291364
06:001,358111268151213
07:001,215136185141201
08:001,473173222155231
09:002,111228300263383
10:004,534640586684902
11:009,4311,1701,3111,5911,776
12:0063,5003,0096,4564,5525,558
13:00113,9814,00210,2096,8808,367
14:00135,3394,12311,4097,3449,634
15:00133,8023,98711,2477,1779,525
16:00137,0583,74111,4467,0039,613
17:00134,6773,67410,8936,7289,327
18:00127,6003,47710,1946,3178,927
19:00124,0973,5289,9166,0869,083
20:0095,9153,2878,2145,4387,336
21:0064,7212,8136,1344,7175,685
22:0042,8232,4434,1953,8164,353
23:0033,2002,0943,4803,3533,668
Total1,277,51347,228112,42979,868102,479

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-05-13).

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.