91³Ô¹ÏÍø

Watch CBS News

San Diego just saw its rainiest day in January history as officials warn of the "fragile state" of the city's infrastructure

San Diego's usually sunny days were clouded by a new record on Monday – the "wettest day in January history," as officials declared the widespread flooding it caused revealed a "fragile state" in the city's infrastructure. 

The National Weather Service said that the Southern California city – the state's second most populous – saw 2.73 inches of rain on Monday, beating the previous record for the wettest January day that was set on Jan. 31, 1979. That same day now ranks fourth among the most rain recorded in a single day in 174 years of record-keeping history in the city. 

The most rain ever recorded in a single day in San Diego was 3.34 inches in December 1854. 

The National Weather Service described the rainfall with a single word – "." 

While there were "a few isolated showers" in the morning, the service's local station said that Tuesday "is looking much, much quieter." Most rain in the area was expected to be done by late morning, "with some showers lingering in the mountains through the afternoon." 

Hundreds of miles across California were impacted by Monday's weather systems, with parts of Southern California seeing rare widespread flash flooding. 

CBS News correspondent Jonathan Vigliotti said that the rain fell so quickly in San Diego, that it turned roads into "raging rivers powerful enough to lift entire cars." The fire department told Vigliotti that hundreds of people had to be rescued – in some cases, with boats. 

"The highest part of our house was our kitchen island," one local resident told Vigliotti, "and that's where we were sitting on top of until we were able to get out safely." 

San Diego Mayor Todd Gloria has for the city, saying in his proclamation that the storm system threatened "conditions of disaster and extreme peril to the safety of persons and property." The city's Stormwater Department said the widespread flooding seen across San Diego "is what happens when heavy rainfall overwhelms an aging stormwater system with limited capacity." 

"Monday's record rainfall revealed the fragile state of the City's stormwater infrastructure and the need for significant investments going forward to prevent the current situation from becoming the new normal for San Diego," the city said in a release on Tuesday. "Prior to the storm, the City had several hundred employees out in the field clearing storm drains and doing other prep work to help reduce flood risk citywide."

Extreme precipitation events are expected to become more frequent as global temperatures continue to increase. As explained by the , warmer air temperatures contribute to warmer ocean temperatures, thereby increasing the amount of water that evaporates into the atmosphere. 

"When more moisture-laden air moves over land or converges into a storm system, it can produce more intense precipitation—for example, heavier rain and snow storms," the EPA says. "The potential impacts of heavy precipitation include crop damage, soil erosion, and an increase in flood risk due to heavy rains —which in turn can lead to injuries, drownings, and other flooding-related effects on health."

Jonathan Vigliotti contributed to this report.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });