Skip to content

Commit d955021

Browse files
Merge pull request #13 from gregory-halverson-jpl/main
fixing hour of day
2 parents 8eaa260 + 08cde00 commit d955021

File tree

1 file changed

+52
-25
lines changed

1 file changed

+52
-25
lines changed

solar_apparent_time/solar_apparent_time.py

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,33 @@ def _broadcast_time_and_space(times: np.ndarray, lons: np.ndarray) -> tuple[np.n
6262

6363
return np.broadcast_arrays(times[..., None], lons)
6464

65+
def extract_lat_lon(geometry: Union[SpatialGeometry, GeoSeries]) -> SpatialGeometry:
66+
"""
67+
Extract the SpatialGeometry from a RasterGeometry or GeoSeries.
68+
69+
Parameters
70+
----------
71+
geometry : SpatialGeometry or GeoSeries
72+
The geometry object to extract from.
73+
74+
Returns
75+
-------
76+
SpatialGeometry
77+
The extracted SpatialGeometry.
78+
"""
79+
if isinstance(geometry, SpatialGeometry):
80+
lat = geometry.lat
81+
lon = geometry.lon
82+
elif isinstance(geometry, GeoSeries):
83+
lat = geometry.y
84+
lon = geometry.x
85+
else:
86+
raise ValueError("geometry must be SpatialGeometry or GeoSeries")
87+
return lat, lon
88+
6589
def calculate_solar_hour_of_day(
6690
time_UTC: Union[datetime, str, list, np.ndarray],
67-
geometry: SpatialGeometry = None,
91+
geometry: Union[SpatialGeometry, GeoSeries] = None,
6892
lat: Union[np.ndarray, float] = None,
6993
lon: Union[np.ndarray, float] = None
7094
) -> np.ndarray:
@@ -93,17 +117,17 @@ def calculate_solar_hour_of_day(
93117
"""
94118
times = _parse_time(time_UTC)
95119

96-
if geometry is not None:
97-
lon = geometry.lon
98-
elif lon is not None:
99-
lon = np.asarray(lon)
120+
if lat is None or lon is None and geometry is not None:
121+
lat, lon = extract_lat_lon(geometry)
122+
123+
times = np.asarray(times)
124+
lon = np.asarray(lon)
125+
if times.ndim == 1 and lon.ndim == 1 and times.shape == lon.shape:
126+
times_b = times
127+
lons_b = lon
100128
else:
101-
raise ValueError('Must provide either spatial or lon.')
102-
103-
# Broadcast times and lons
104-
times_b, lons_b = _broadcast_time_and_space(times, lon)
129+
times_b, lons_b = _broadcast_time_and_space(times, lon)
105130

106-
# Calculate hour_UTC
107131
hour_UTC = (
108132
times_b.astype('datetime64[h]').astype(int) % 24
109133
+ (times_b.astype('datetime64[m]').astype(int) % 60) / 60
@@ -119,7 +143,7 @@ def calculate_solar_hour_of_day(
119143

120144
def calculate_solar_day_of_year(
121145
time_UTC: Union[datetime, str, list, np.ndarray],
122-
geometry: SpatialGeometry = None,
146+
geometry: Union[SpatialGeometry, GeoSeries] = None,
123147
lat: Union[np.ndarray, float] = None,
124148
lon: Union[np.ndarray, float] = None
125149
) -> np.ndarray:
@@ -148,20 +172,23 @@ def calculate_solar_day_of_year(
148172
"""
149173
times = _parse_time(time_UTC)
150174

151-
# If latitude is not provided, try to extract from geometry
152-
if lat is None and isinstance(geometry, SpatialGeometry):
153-
lat = geometry.lat
154-
elif lat is None and isinstance(geometry, GeoSeries):
155-
lat = geometry.y
156-
elif lat is None:
157-
raise ValueError("no latitude provided")
158-
159-
if lon is None and isinstance(geometry, SpatialGeometry):
160-
lon = geometry.lon
161-
elif lon is None and isinstance(geometry, GeoSeries):
162-
lon = geometry.x
163-
elif lon is None:
164-
raise ValueError("no longitude provided")
175+
# # If latitude is not provided, try to extract from geometry
176+
# if lat is None and isinstance(geometry, SpatialGeometry):
177+
# lat = geometry.lat
178+
# elif lat is None and isinstance(geometry, GeoSeries):
179+
# lat = geometry.y
180+
# elif lat is None:
181+
# raise ValueError("no latitude provided")
182+
183+
# if lon is None and isinstance(geometry, SpatialGeometry):
184+
# lon = geometry.lon
185+
# elif lon is None and isinstance(geometry, GeoSeries):
186+
# lon = geometry.x
187+
# elif lon is None:
188+
# raise ValueError("no longitude provided")
189+
190+
if lat is None or lon is None and geometry is not None:
191+
lat, lon = extract_lat_lon(geometry)
165192

166193
# Handle 1D time and lon inputs of the same length: pair element-wise
167194
times = np.asarray(times)

0 commit comments

Comments
 (0)