Skip to content

Commit e6b6055

Browse files
Merge pull request #4 from gregory-halverson-jpl/main
including `UTC_offset_hours`, `day_of_year`, and `hour_of_day`
2 parents b917d39 + 16fad2b commit e6b6055

File tree

4 files changed

+137
-3
lines changed

4 files changed

+137
-3
lines changed

README.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,60 @@ The `solar_apparent_time` Python package translates Python datetime between sola
55
[Gregory H. Halverson](https://github.com/gregory-halverson-jpl) (they/them)<br>
66
77
NASA Jet Propulsion Laboratory 329G
8+
9+
## Usage
10+
11+
### `UTC_to_solar(time_UTC: datetime, lon: float) -> datetime`
12+
13+
Converts Coordinated Universal Time (UTC) to solar apparent time at given longitude for single time.
14+
15+
**Parameters:**
16+
- `time_UTC` (datetime): The UTC time.
17+
- `lon` (float): The longitude in degrees.
18+
19+
**Returns:**
20+
- datetime: The solar time at the given longitude.
21+
22+
### `solar_to_UTC(time_solar: datetime, lon: float) -> datetime`
23+
24+
Converts solar apparent time to Coordinated Universal Time (UTC) at given longitude for single time.
25+
26+
**Parameters:**
27+
- `time_solar` (datetime): The solar time.
28+
- `lon` (float): The longitude in degrees.
29+
30+
**Returns:**
31+
- datetime: The UTC time at the given longitude.
32+
33+
### `UTC_offset_hours(geometry: rasters.RasterGeometry) -> rasters.Raster`
34+
35+
Calculates the UTC offset in hours for an area defined by a `RasterGeometry` object from the `rasters` package.
36+
37+
**Parameters:**
38+
- `geometry` (rasters.RasterGeometry): The raster geometry.
39+
40+
**Returns:**
41+
- rasters.Raster: The UTC offset in hours.
42+
43+
### `day_of_year(time_UTC: datetime, geometry: rasters.RasterGeometry) -> rasters.Raster`
44+
45+
Calculates the day of the year for a given UTC time and an area defined by a `RasterGeometry` object from the `rasters` package.
46+
47+
**Parameters:**
48+
- `time_UTC` (datetime): The UTC time.
49+
- `geometry` (rasters.RasterGeometry): The raster geometry.
50+
51+
**Returns:**
52+
- rasters.Raster: The day of the year.
53+
54+
### `hour_of_day(time_UTC: datetime, geometry: rasters.RasterGeometry) -> rasters.Raster`
55+
56+
Calculates the hour of the day for a given UTC time and an area defined by a `RasterGeometry` object from the `rasters` package.
57+
58+
**Parameters:**
59+
- `time_UTC` (datetime): The UTC time.
60+
- `geometry` (rasters.RasterGeometry): The raster geometry.
61+
62+
**Returns:**
63+
- rasters.Raster: The hour of the day.
64+

pyproject.toml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ requires = ["setuptools>=60", "setuptools-scm>=8.0", "wheel"]
33

44
[project]
55
name = "solar_apparent_time"
6-
version = "1.0.2"
6+
version = "1.1.0"
77
description = "methods to translate Python datetime between solar apparent time and Coordinate Universal Time (UTC)"
88
readme = "README.md"
99
authors = [
@@ -14,10 +14,14 @@ classifiers = [
1414
"Operating System :: OS Independent",
1515
]
1616
dependencies = [
17-
"numpy"
17+
"numpy",
18+
"rasters"
1819
]
1920

2021
requires-python = ">=3.11"
2122

2223
[tool.setuptools.package-data]
2324
solar_apparent_time = ["*.txt"]
25+
26+
[project.urls]
27+
"Homepage" = "https://github.com/JPL-Evapotranspiration-Algorithms/solar_apparent_time"
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,81 @@
11
from datetime import datetime, timedelta
22
import numpy as np
3+
import rasters as rt
34

45
def UTC_to_solar(time_UTC: datetime, lon: float) -> datetime:
6+
"""
7+
Converts Coordinated Universal Time (UTC) to solar time.
8+
9+
Parameters:
10+
time_UTC (datetime): The UTC time.
11+
lon (float): The longitude in degrees.
12+
13+
Returns:
14+
datetime: The solar time at the given longitude.
15+
"""
516
return time_UTC + timedelta(hours=(np.radians(lon) / np.pi * 12))
617

718
def solar_to_UTC(time_solar: datetime, lon: float) -> datetime:
19+
"""
20+
Converts solar time to Coordinated Universal Time (UTC).
21+
22+
Parameters:
23+
time_solar (datetime): The solar time.
24+
lon (float): The longitude in degrees.
25+
26+
Returns:
27+
datetime: The UTC time at the given longitude.
28+
"""
829
return time_solar - timedelta(hours=(np.radians(lon) / np.pi * 12))
30+
31+
def UTC_offset_hours(geometry: rt.RasterGeometry) -> rt.Raster:
32+
"""
33+
Calculates the UTC offset in hours for a given raster geometry.
34+
35+
Parameters:
36+
geometry (rt.RasterGeometry): The raster geometry.
37+
38+
Returns:
39+
rt.Raster: The UTC offset in hours.
40+
"""
41+
return rt.Raster(np.radians(geometry.lon) / np.pi * 12, geometry=geometry)
42+
43+
def day_of_year(time_UTC: datetime, geometry: rt.RasterGeometry) -> rt.Raster:
44+
"""
45+
Calculates the day of the year for a given UTC time and raster geometry.
46+
47+
Parameters:
48+
time_UTC (datetime): The UTC time.
49+
geometry (rt.RasterGeometry): The raster geometry.
50+
51+
Returns:
52+
rt.Raster: The day of the year.
53+
"""
54+
doy_UTC = time_UTC.timetuple().tm_yday
55+
hour_UTC = time_UTC.hour + time_UTC.minute / 60 + time_UTC.second / 3600
56+
UTC_offset_hours = UTC_offset_hours(geometry=geometry)
57+
hour_of_day = hour_UTC + UTC_offset_hours
58+
doy = doy_UTC
59+
doy = rt.where(hour_of_day < 0, doy - 1, doy)
60+
doy = rt.where(hour_of_day > 24, doy + 1, doy)
61+
62+
return doy
63+
64+
def hour_of_day(time_UTC: datetime, geometry: rt.RasterGeometry) -> rt.Raster:
65+
"""
66+
Calculates the hour of the day for a given UTC time and raster geometry.
67+
68+
Parameters:
69+
time_UTC (datetime): The UTC time.
70+
geometry (rt.RasterGeometry): The raster geometry.
71+
72+
Returns:
73+
rt.Raster: The hour of the day.
74+
"""
75+
hour_UTC = time_UTC.hour + time_UTC.minute / 60 + time_UTC.second / 3600
76+
UTC_offset_hours = UTC_offset_hours(geometry=geometry)
77+
hour_of_day = hour_UTC + UTC_offset_hours
78+
hour_of_day = rt.where(hour_of_day < 0, hour_of_day + 24, hour_of_day)
79+
hour_of_day = rt.where(hour_of_day > 24, hour_of_day - 24, hour_of_day)
80+
81+
return hour_of_day

solar_apparent_time/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.2
1+
1.1.0

0 commit comments

Comments
 (0)