@@ -16,7 +16,12 @@ class Forecast:
16
16
17
17
>>> import datapoint
18
18
>>> m = datapoint.Manager.Manager(api_key = "blah")
19
- >>> f = m.get_forecast(latitude=50, longitude=0, frequency="hourly")
19
+ >>> f = m.get_forecast(
20
+ latitude=50,
21
+ longitude=0,
22
+ frequency="hourly",
23
+ convert_weather_code=True,
24
+ )
20
25
>>> f.now()
21
26
{
22
27
'time': datetime.datetime(2024, 2, 19, 13, 0, tzinfo=datetime.timezone.utc),
@@ -101,12 +106,14 @@ class Forecast:
101
106
}
102
107
"""
103
108
104
- def __init__ (self , frequency , api_data ):
109
+ def __init__ (self , frequency , api_data , convert_weather_code ):
105
110
"""
106
111
:param frequency: Frequency of forecast: 'hourly', 'three-hourly' or 'daily'
107
112
:param api_data: Data returned from API call
113
+ :param: convert_weather_code: Convert numeric weather codes to string description
108
114
:type frequency: string
109
115
:type api_data: dict
116
+ :type convert_weather_code: bool
110
117
"""
111
118
self .frequency = frequency
112
119
# Need to parse format like 2024-02-17T15:00Z. This can only be
@@ -136,6 +143,10 @@ def __init__(self, frequency, api_data):
136
143
2
137
144
] #: The elevation of the location of the provided forecast
138
145
146
+ self .convert_weather_code = (
147
+ convert_weather_code #: Convert numeric weather codes to string description
148
+ )
149
+
139
150
forecasts = api_data ["features" ][0 ]["properties" ]["timeSeries" ]
140
151
parameters = api_data ["parameters" ][0 ]
141
152
if frequency == "daily" :
@@ -203,23 +214,57 @@ def _build_timesteps_from_daily(self, forecasts, parameters):
203
214
case_corrected_element = (
204
215
trimmed_element [0 ].lower () + trimmed_element [1 :]
205
216
)
206
- day_step [case_corrected_element ] = {
207
- "value" : value ,
208
- "description" : parameters [element ]["description" ],
209
- "unit_name" : parameters [element ]["unit" ]["label" ],
210
- "unit_symbol" : parameters [element ]["unit" ]["symbol" ]["type" ],
211
- }
217
+
218
+ if (
219
+ case_corrected_element == "significantWeatherCode"
220
+ and self .convert_weather_code
221
+ ):
222
+ day_step [case_corrected_element ] = {
223
+ "value" : WEATHER_CODES [str (value )],
224
+ "description" : parameters [element ]["description" ],
225
+ "unit_name" : parameters [element ]["unit" ]["label" ],
226
+ "unit_symbol" : parameters [element ]["unit" ]["symbol" ][
227
+ "type"
228
+ ],
229
+ }
230
+
231
+ else :
232
+ day_step [case_corrected_element ] = {
233
+ "value" : value ,
234
+ "description" : parameters [element ]["description" ],
235
+ "unit_name" : parameters [element ]["unit" ]["label" ],
236
+ "unit_symbol" : parameters [element ]["unit" ]["symbol" ][
237
+ "type"
238
+ ],
239
+ }
212
240
elif element .startswith ("night" ):
213
241
trimmed_element = element .replace ("night" , "" )
214
242
case_corrected_element = (
215
243
trimmed_element [0 ].lower () + trimmed_element [1 :]
216
244
)
217
- night_step [case_corrected_element ] = {
218
- "value" : value ,
219
- "description" : parameters [element ]["description" ],
220
- "unit_name" : parameters [element ]["unit" ]["label" ],
221
- "unit_symbol" : parameters [element ]["unit" ]["symbol" ]["type" ],
222
- }
245
+
246
+ if (
247
+ case_corrected_element == "significantWeatherCode"
248
+ and self .convert_weather_code
249
+ ):
250
+ night_step [case_corrected_element ] = {
251
+ "value" : WEATHER_CODES [str (value )],
252
+ "description" : parameters [element ]["description" ],
253
+ "unit_name" : parameters [element ]["unit" ]["label" ],
254
+ "unit_symbol" : parameters [element ]["unit" ]["symbol" ][
255
+ "type"
256
+ ],
257
+ }
258
+
259
+ else :
260
+ night_step [case_corrected_element ] = {
261
+ "value" : value ,
262
+ "description" : parameters [element ]["description" ],
263
+ "unit_name" : parameters [element ]["unit" ]["label" ],
264
+ "unit_symbol" : parameters [element ]["unit" ]["symbol" ][
265
+ "type"
266
+ ],
267
+ }
223
268
elif element == "maxUvIndex" :
224
269
day_step [element ] = {
225
270
"value" : value ,
@@ -260,7 +305,7 @@ def _build_timestep(self, forecast, parameters):
260
305
forecast ["time" ], "%Y-%m-%dT%H:%M%z"
261
306
)
262
307
263
- elif element == "significantWeatherCode" :
308
+ elif element == "significantWeatherCode" and self . convert_weather_code :
264
309
timestep [element ] = {
265
310
"value" : WEATHER_CODES [str (value )],
266
311
"description" : parameters [element ]["description" ],
0 commit comments