Spaces:
Sleeping
Sleeping
Optimize DWD ICON data downloads for faster performance
Browse files- Reduce parameters to 8 essential variables (temp, wind, precip, snow, clouds, cape, gusts)
- Cut forecast hours from 10 to 8 key intervals for 4-day forecast
- Fix timezone comparison issues in daily forecast generation
- Remove problematic LPI parameter causing 404 errors
- Use default humidity values to avoid extra downloads
- Optimize synthetic data generation to 6-hour intervals
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
app.py
CHANGED
|
@@ -233,23 +233,16 @@ def fetch_dwd_icon_data(lat, lon):
|
|
| 233 |
run_date = get_latest_dwd_run()
|
| 234 |
print(f"Using DWD ICON run: {run_date.strftime('%Y-%m-%d %H:%M UTC')}")
|
| 235 |
|
| 236 |
-
# Define parameters
|
| 237 |
parameters = {
|
| 238 |
't_2m': 'Temperature at 2m',
|
| 239 |
-
'relhum_2m': 'Relative humidity at 2m',
|
| 240 |
'u_10m': 'U-component of wind at 10m',
|
| 241 |
'v_10m': 'V-component of wind at 10m',
|
| 242 |
-
'pmsl': 'Pressure at mean sea level',
|
| 243 |
'tot_prec': 'Total precipitation',
|
| 244 |
-
'rain_con': 'Convective rain',
|
| 245 |
-
'rain_gsp': 'Grid-scale rain',
|
| 246 |
-
'snow_con': 'Convective snow',
|
| 247 |
'snow_gsp': 'Grid-scale snow',
|
| 248 |
-
'cape_con': 'Convective Available Potential Energy',
|
| 249 |
'clct': 'Total cloud cover',
|
| 250 |
-
'
|
| 251 |
-
'vmax_10m': 'Wind gusts at 10m'
|
| 252 |
-
'lpi_con': 'Lightning Potential Index'
|
| 253 |
}
|
| 254 |
|
| 255 |
# Download coordinate files first
|
|
@@ -371,8 +364,8 @@ def fetch_fallback_data(lat, lon):
|
|
| 371 |
current_time = datetime.now(timezone.utc)
|
| 372 |
forecast_hours = []
|
| 373 |
|
| 374 |
-
# Generate forecast times
|
| 375 |
-
for i in range(0, 97,
|
| 376 |
forecast_time = current_time + timedelta(hours=i)
|
| 377 |
forecast_hours.append(forecast_time)
|
| 378 |
|
|
@@ -515,15 +508,8 @@ def process_real_dwd_data(dwd_data, lat, lon):
|
|
| 515 |
else:
|
| 516 |
temperature.append(15.0) # Default
|
| 517 |
|
| 518 |
-
# Humidity
|
| 519 |
-
|
| 520 |
-
if rh is not None:
|
| 521 |
-
if rh <= 1.0: # Fraction
|
| 522 |
-
humidity.append(rh * 100)
|
| 523 |
-
else: # Already percentage
|
| 524 |
-
humidity.append(rh)
|
| 525 |
-
else:
|
| 526 |
-
humidity.append(60.0) # Default
|
| 527 |
|
| 528 |
# Wind components
|
| 529 |
u_10m = data['u_10m'][i] if data['u_10m'][i] is not None else 0.0
|
|
@@ -970,23 +956,25 @@ def generate_daily_detailed_forecasts(forecast_data, events):
|
|
| 970 |
temperatures = forecast_data['temperature']
|
| 971 |
precipitation = forecast_data.get('precipitation', [0] * len(temperatures))
|
| 972 |
wind_speeds = forecast_data['wind_speed']
|
| 973 |
-
humidity = forecast_data
|
| 974 |
cloud_cover = forecast_data.get('cloud_cover', [50] * len(temperatures))
|
| 975 |
|
| 976 |
-
# Process 4 days of forecasts
|
| 977 |
for day_offset in range(4):
|
| 978 |
-
|
|
|
|
|
|
|
| 979 |
|
| 980 |
# Get day and night periods
|
| 981 |
day_start = target_date.replace(hour=6, minute=0, second=0, microsecond=0)
|
| 982 |
day_end = target_date.replace(hour=18, minute=0, second=0, microsecond=0)
|
| 983 |
night_end = (target_date + timedelta(days=1)).replace(hour=6, minute=0, second=0, microsecond=0)
|
| 984 |
|
| 985 |
-
# Find data for this day
|
| 986 |
day_indices = [i for i, ts in enumerate(timestamps)
|
| 987 |
-
if day_start <= ts < day_end]
|
| 988 |
night_indices = [i for i, ts in enumerate(timestamps)
|
| 989 |
-
if day_end <= ts < night_end]
|
| 990 |
|
| 991 |
if not day_indices and not night_indices:
|
| 992 |
continue
|
|
|
|
| 233 |
run_date = get_latest_dwd_run()
|
| 234 |
print(f"Using DWD ICON run: {run_date.strftime('%Y-%m-%d %H:%M UTC')}")
|
| 235 |
|
| 236 |
+
# Define ESSENTIAL parameters only for faster downloads
|
| 237 |
parameters = {
|
| 238 |
't_2m': 'Temperature at 2m',
|
|
|
|
| 239 |
'u_10m': 'U-component of wind at 10m',
|
| 240 |
'v_10m': 'V-component of wind at 10m',
|
|
|
|
| 241 |
'tot_prec': 'Total precipitation',
|
|
|
|
|
|
|
|
|
|
| 242 |
'snow_gsp': 'Grid-scale snow',
|
|
|
|
| 243 |
'clct': 'Total cloud cover',
|
| 244 |
+
'cape_con': 'Convective Available Potential Energy',
|
| 245 |
+
'vmax_10m': 'Wind gusts at 10m'
|
|
|
|
| 246 |
}
|
| 247 |
|
| 248 |
# Download coordinate files first
|
|
|
|
| 364 |
current_time = datetime.now(timezone.utc)
|
| 365 |
forecast_hours = []
|
| 366 |
|
| 367 |
+
# Generate forecast times - 4 days with 6-hour intervals
|
| 368 |
+
for i in range(0, 97, 6): # Every 6 hours for 4 days
|
| 369 |
forecast_time = current_time + timedelta(hours=i)
|
| 370 |
forecast_hours.append(forecast_time)
|
| 371 |
|
|
|
|
| 508 |
else:
|
| 509 |
temperature.append(15.0) # Default
|
| 510 |
|
| 511 |
+
# Humidity - use default since we don't download it for speed
|
| 512 |
+
humidity.append(60.0) # Default humidity for faster processing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 513 |
|
| 514 |
# Wind components
|
| 515 |
u_10m = data['u_10m'][i] if data['u_10m'][i] is not None else 0.0
|
|
|
|
| 956 |
temperatures = forecast_data['temperature']
|
| 957 |
precipitation = forecast_data.get('precipitation', [0] * len(temperatures))
|
| 958 |
wind_speeds = forecast_data['wind_speed']
|
| 959 |
+
humidity = forecast_data.get('humidity', [60] * len(temperatures))
|
| 960 |
cloud_cover = forecast_data.get('cloud_cover', [50] * len(temperatures))
|
| 961 |
|
| 962 |
+
# Process 4 days of forecasts - fix timezone comparison
|
| 963 |
for day_offset in range(4):
|
| 964 |
+
# Use timezone-naive datetime for comparison
|
| 965 |
+
base_time = current_time.replace(tzinfo=None) if current_time.tzinfo else current_time
|
| 966 |
+
target_date = base_time + timedelta(days=day_offset)
|
| 967 |
|
| 968 |
# Get day and night periods
|
| 969 |
day_start = target_date.replace(hour=6, minute=0, second=0, microsecond=0)
|
| 970 |
day_end = target_date.replace(hour=18, minute=0, second=0, microsecond=0)
|
| 971 |
night_end = (target_date + timedelta(days=1)).replace(hour=6, minute=0, second=0, microsecond=0)
|
| 972 |
|
| 973 |
+
# Find data for this day - handle timezone-aware timestamps
|
| 974 |
day_indices = [i for i, ts in enumerate(timestamps)
|
| 975 |
+
if day_start <= (ts.replace(tzinfo=None) if ts.tzinfo else ts) < day_end]
|
| 976 |
night_indices = [i for i, ts in enumerate(timestamps)
|
| 977 |
+
if day_end <= (ts.replace(tzinfo=None) if ts.tzinfo else ts) < night_end]
|
| 978 |
|
| 979 |
if not day_indices and not night_indices:
|
| 980 |
continue
|