1717logger = logging .getLogger (__name__ )
1818
1919
20- def gpsweekD ( yr , doy , wkday_suff = False ):
20+ def derive_gps_week ( year : Union [ int , str ], day_of_year : Union [ int , str ], weekday_suffix : bool = False ) -> str :
2121 """
2222 Convert year, day-of-year to GPS week format: WWWWD or WWWW
2323 Based on code from Kristine Larson's gps.py
@@ -32,30 +32,37 @@ def gpsweekD(yr, doy, wkday_suff=False):
3232 """
3333
3434 # Set up the date and time variables
35- yr = int (yr )
36- doy = int (doy )
37- dt = _datetime .strptime (f"{ yr } -{ doy :03d} 01" , "%Y-%j %H" )
35+ year = int (year )
36+ day_of_year = int (day_of_year )
37+ dt : _datetime = _datetime .strptime (f"{ year } -{ day_of_year :03d} 01" , "%Y-%j %H" )
3838
3939 wkday = dt .weekday () + 1
4040
4141 if wkday == 7 :
4242 wkday = 0
4343
44- mn , dy , hr = dt .month , dt .day , dt .hour
44+ month , day , hour = dt .month , dt .day , dt .hour
4545
46- if mn <= 2 :
47- yr = yr - 1
48- mn = mn + 12
46+ if month <= 2 :
47+ year = year - 1
48+ month = month + 12
4949
50- JD = _np .floor (365.25 * yr ) + _np .floor (30.6001 * (mn + 1 )) + dy + hr / 24.0 + 1720981.5
51- GPS_wk = int (_np .floor ((JD - 2444244.5 ) / 7.0 ))
50+ julian_day : float = _np .floor (365.25 * year ) + _np .floor (30.6001 * (month + 1 )) + day + hour / 24.0 + 1720981.5
51+ GPS_wk = int (_np .floor ((julian_day - 2444244.5 ) / 7.0 ))
5252
53- if wkday_suff :
53+ if weekday_suffix :
5454 return str (GPS_wk ) + str (wkday )
5555 else :
5656 return str (GPS_wk )
5757
5858
59+ def gpsweekD (yr , doy , wkday_suff = False ) -> str :
60+ """
61+ TODO DEPRECATED. Legacy wrapper for the above
62+ """
63+ return derive_gps_week (yr , doy , wkday_suff )
64+
65+
5966class GPSDate :
6067 """
6168 Representation of datetime that provides easy access to
@@ -94,24 +101,49 @@ def as_datetime(self) -> _datetime:
94101 return _pd .Timestamp (self ._internal_dt64 ).to_pydatetime ()
95102
96103 @property
97- def yr (self ) -> str :
104+ def as_date (self ) -> _date :
105+ """Convert to Python `date` object."""
106+ return self ._internal_dt64 .astype (_date )
107+
108+ @property
109+ def year (self ) -> str :
98110 """Year"""
99111 return self .as_datetime .strftime ("%Y" )
100112
113+ @property # For backwards compatibility
114+ def yr (self ) -> str :
115+ """Year DEPRECATED, use GPSDate.year"""
116+ return self .year
117+
101118 @property
102- def dy (self ) -> str :
119+ def day_of_year (self ) -> str :
103120 """Day of year"""
104121 return self .as_datetime .strftime ("%j" )
105122
123+ @property # For backwards compatibility
124+ def dy (self ) -> str :
125+ """Day of year. DEPRECATED, use GPSDate.day_of_year"""
126+ return self .day_of_year
127+
106128 @property
107- def gpswk (self ) -> str :
129+ def gps_week (self ) -> str :
108130 """GPS week"""
109- return gpsweekD (self .yr , self .dy , wkday_suff = False )
131+ return derive_gps_week (self .yr , self .dy , weekday_suffix = False )
132+
133+ @property # For backwards compatibility
134+ def gpswk (self ) -> str :
135+ """GPS week. DEPRECATED, use GPSDate.gps_week"""
136+ return self .gps_week
110137
111138 @property
112- def gpswkD (self ) -> str :
139+ def gps_week_and_day_of_week (self ) -> str :
113140 """GPS week with weekday suffix"""
114- return gpsweekD (self .yr , self .dy , wkday_suff = True )
141+ return derive_gps_week (self .yr , self .dy , weekday_suffix = True )
142+
143+ @property # For backwards compatibility
144+ def gpswkD (self ) -> str :
145+ """GPS week with weekday suffix. DEPRECATED, use GPSDate.gps_week_and_day_of_week"""
146+ return self .gps_week_and_day_of_week
115147
116148 @property
117149 def next (self ):
@@ -128,24 +160,27 @@ def __str__(self) -> str:
128160 return str (self ._internal_dt64 )
129161
130162
131- def dt2gpswk (dt , wkday_suff = False , both = False ) -> Union [ str , tuple [ str , str ]] :
163+ def datetime_to_gps_week (dt : _datetime , wkday_suff : bool = False ) -> str :
132164 """
133- Convert the given datetime object to a GPS week (option to include day suffix)
165+ Convert given datetime object to GPS week e.g. '2350', optionally including day suffix e.g. '23500' (Sunday)
166+
167+ :param datetime dt: datetime for which to calculate a GPS week (and optionally day)
168+ :returns str: intput datetime expressed as a GPS week (wwww) or GPS week with day (wwwwd)
134169 """
135170 yr = dt .strftime ("%Y" )
136171 doy = dt .strftime ("%j" )
137- if not both :
138- return gpsweekD (yr , doy , wkday_suff = wkday_suff )
139- else :
140- return gpsweekD (yr , doy , wkday_suff = False ), gpsweekD (yr , doy , wkday_suff = True )
172+ return derive_gps_week (yr , doy , weekday_suffix = wkday_suff )
141173
142174
143- # TODO DEPRECATED
144- def gpswkD2dt (gpswkD : str ) -> _datetime :
175+ def dt2gpswk (dt : _datetime , wkday_suff : bool = False , both : bool = False ) -> Union [str , tuple [str , str ]]:
145176 """
146- DEPRECATED. This is a compatibility wrapper. Use gps_week_day_to_datetime() instead.
177+ TODO DEPRECATED. Please use datetime_to_gps_week()
147178 """
148- return gps_week_day_to_datetime (gpswkD )
179+
180+ if both :
181+ return (datetime_to_gps_week (dt , wkday_suff = False ), datetime_to_gps_week (dt , wkday_suff = True ))
182+ else :
183+ return datetime_to_gps_week (dt , wkday_suff = wkday_suff )
149184
150185
151186def gps_week_day_to_datetime (gps_week_and_weekday : str ) -> _datetime :
@@ -178,6 +213,14 @@ def gps_week_day_to_datetime(gps_week_and_weekday: str) -> _datetime:
178213 return dt_64 .astype (_datetime )
179214
180215
216+ # TODO DEPRECATED
217+ def gpswkD2dt (gpswkD : str ) -> _datetime :
218+ """
219+ DEPRECATED. This is a compatibility wrapper. Use gps_week_day_to_datetime() instead.
220+ """
221+ return gps_week_day_to_datetime (gpswkD )
222+
223+
181224def yydoysec2datetime (
182225 arr : Union [_np .ndarray , _pd .Series , list ], recenter : bool = False , as_j2000 : bool = True , delimiter : str = ":"
183226) -> _np .ndarray :
0 commit comments