@@ -758,23 +758,8 @@ cdef _find_subsecond_reso(str timestr, int64_t* nanos):
758
758
return reso
759
759
760
760
761
- # Parsing for iso_ordinal date
761
+ # Parsing for iso_ordinal date, multi-year period, quarter-based multi-year period, and multi-week period
762
762
# ----------------------------------------------------------------------
763
- def _parse_iso_ordinal_date (value: str ):
764
- """
765
- Parses an ISO 8601 ordinal date format (YYYY-DDD).
766
-
767
- Example:
768
- "1981-095" → "1981-04-05"
769
- """
770
- match = re.match(r " ^ ( \d {4} ) -( \d {3} ) $ " , value)
771
- if match:
772
- year, day_of_year = match.groups()
773
- date = datetime.strptime(f" {year}-{day_of_year}" , " %Y -%j " ).date()
774
- return f" {date.year}-{date.month:02d}-{date.day:02d}" # Convert to YYYY-MM-DD
775
- return None # Not a match
776
-
777
-
778
763
def parse_time_string (time_str , freq = None ):
779
764
"""
780
765
Extended parsing logic to handle:
@@ -792,6 +777,10 @@ def parse_time_string(time_str, freq=None):
792
777
# Handle Multi-Quarter Spans (e.g., "2019Q1-2021Q4")
793
778
multi_quarter_match = re.match(r " ^ ( \d {4} Q[1-4 ]) -( \d {4} Q[1-4 ]) $ " , time_str)
794
779
780
+ # Handle Week Start-End Format (YYYYMMDD-YYYYMMDD)
781
+ week_match = re.match(r " ^ ( \d {8} ) -( \d {8} ) $ " , time_str)
782
+
783
+
795
784
if ordinal_match:
796
785
try :
797
786
year, day_of_year = map (int , ordinal_match.groups())
@@ -809,8 +798,19 @@ def parse_time_string(time_str, freq=None):
809
798
start_q, end_q = multi_quarter_match.groups()
810
799
return pd.period_range(start = start_q, end = end_q, freq = " Q" )
811
800
801
+ elif week_match:
802
+ start_date, end_date = week_match.groups()
803
+ start = pd.Timestamp(start_date)
804
+ end = pd.Timestamp(end_date)
805
+
806
+ # Ensure the range actually covers a full week (7 days)
807
+ if (end - start).days == 6 :
808
+ return pd.Period(start, freq = " W" )
809
+
810
+
812
811
return None # No match found
813
812
813
+
814
814
# ----------------------------------------------------------------------
815
815
# Parsing for type-inference
816
816
0 commit comments