File size: 3,756 Bytes
b23cefb
 
 
 
 
 
b5f210c
5f29f14
b23cefb
 
5f29f14
 
 
 
b23cefb
 
5f29f14
 
 
b23cefb
 
 
 
 
 
 
5f29f14
 
 
 
 
b23cefb
 
 
 
 
 
 
 
 
 
 
5f29f14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b23cefb
 
5f29f14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b5f210c
5f29f14
 
 
 
 
 
 
 
 
 
b23cefb
5f29f14
 
 
 
 
 
 
b23cefb
b5f210c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import openmeteo_requests

import requests_cache
import pandas as pd
from retry_requests import retry

from compute_et0_adjusted import compute_et0


def download_historical_weather_data(
        latitude: float,
        longitude: float,
        start_year: int,
        end_year: int,
) -> pd.DataFrame:
	# Setup the Open-Meteo API client with cache and retry on error
	cache_session = requests_cache.CachedSession('.cache', expire_after=-1)
	retry_session = retry(cache_session, retries=5, backoff_factor=0.2)
	openmeteo = openmeteo_requests.Client(session=retry_session)

	# Make sure all required weather variables are listed here
	# The order of variables in hourly or daily is important to assign them correctly below
	url = "https://archive-api.open-meteo.com/v1/archive"
	params = {
		"latitude": latitude,
		"longitude": longitude,
		"start_date": f"{start_year}-02-08",
		"end_date": f"{end_year}-02-22",
		"hourly": ["temperature_2m", "relative_humidity_2m",
				   "precipitation", "et0_fao_evapotranspiration",
				   "wind_speed_10m", "shortwave_radiation"],
		"timezone": "GMT"
	}
	responses = openmeteo.weather_api(url, params=params)

	# Process first location. Add a for-loop for multiple locations or weather models
	response = responses[0]
	print(f"Coordinates {response.Latitude()}°N {response.Longitude()}°E")
	print(f"Elevation {response.Elevation()} m asl")
	print(f"Timezone {response.Timezone()} {response.TimezoneAbbreviation()}")
	print(f"Timezone difference to GMT+0 {response.UtcOffsetSeconds()} s")

	# Process hourly data. The order of variables needs to be the same as requested.
	hourly = response.Hourly()
	hourly_temperature_2m = hourly.Variables(0).ValuesAsNumpy()
	hourly_relative_humidity_2m = hourly.Variables(1).ValuesAsNumpy()
	hourly_precipitation = hourly.Variables(2).ValuesAsNumpy()
	hourly_et0_fao_evapotranspiration = hourly.Variables(3).ValuesAsNumpy()
	hourly_wind_speed_10m = hourly.Variables(4).ValuesAsNumpy()
	hourly_shortwave_radiation = hourly.Variables(5).ValuesAsNumpy()

	hourly_data = {
		"temperature_2m": hourly_temperature_2m,
		"relative_humidity_2m": hourly_relative_humidity_2m,
		"precipitation": hourly_precipitation,
		"et0_fao_evapotranspiration": hourly_et0_fao_evapotranspiration,
		"wind_speed_10m": hourly_wind_speed_10m,
		"shortwave_radiation": hourly_shortwave_radiation,
	}
	hourly_dataframe = pd.DataFrame(
		index=pd.date_range(
			start=pd.to_datetime(hourly.Time(), unit="s", utc=True),
			end=pd.to_datetime(hourly.TimeEnd(), unit="s", utc=True),
			freq=pd.Timedelta(seconds=hourly.Interval()),
			inclusive="left"
		),
		data=hourly_data,
	)

	return hourly_dataframe


def aggregate_hourly_weather_data(
		hourly_data: pd.DataFrame,
) -> pd.DataFrame:
	resampled_data = hourly_data.resample("1ME").agg({
		"temperature_2m": ["min", "max"],
		"relative_humidity_2m": ["min", "max"],
		"wind_speed_10m": "mean",
		"shortwave_radiation": "mean",
	})

	monthly_data = pd.DataFrame.from_dict({
		"day_of_year": resampled_data.index.dayofyear,
		"air_temperature_min": resampled_data[("temperature_2m", "min")],
		"air_temperature_max": resampled_data[("temperature_2m", "max")],
		"relative_humidity_min": resampled_data[("relative_humidity_2m", "min")],
		"relative_humidity_max": resampled_data[("relative_humidity_2m", "max")],
		"wind_speed": resampled_data[("wind_speed_10m", "mean")],
		"irradiance": resampled_data[("shortwave_radiation", "mean")],
	})

	return monthly_data


if __name__ == '__main__':
	latitude = 47
	longitude = 3
	start_year = 2020
	end_year = 2021
	df = download_historical_weather_data(latitude, longitude, start_year, end_year)
	monthly_df = aggregate_hourly_weather_data(df)

	et0 = compute_et0(monthly_df, latitude, longitude)
	print(et0)