1717
1818import datetime
1919import re
20- from typing import Union
20+ from typing import Optional , Union
2121
2222import numpy
2323import packaging .version
@@ -103,7 +103,7 @@ def _datetime(
103103 r"(?::(?P<seconds>\d+)"
104104 r"(?:\.(?P<fraction>\d*))?)?)?\s*$"
105105 ).match ,
106- ):
106+ ) -> Optional [ numpy . datetime64 ] :
107107 # Convert pyarrow values to datetime.time.
108108 if isinstance (scalar , (pyarrow .Time32Scalar , pyarrow .Time64Scalar )):
109109 scalar = (
@@ -115,8 +115,16 @@ def _datetime(
115115
116116 if scalar is None :
117117 return None
118- elif isinstance (scalar , datetime .time ):
119- return datetime .datetime .combine (_EPOCH , scalar )
118+ if isinstance (scalar , datetime .time ):
119+ return pandas .Timestamp (
120+ year = 1970 ,
121+ month = 1 ,
122+ day = 1 ,
123+ hour = scalar .hour ,
124+ minute = scalar .minute ,
125+ second = scalar .second ,
126+ microsecond = scalar .microsecond ,
127+ ).to_datetime64 ()
120128 elif isinstance (scalar , pandas .Timestamp ):
121129 return scalar .to_datetime64 ()
122130 elif isinstance (scalar , str ):
@@ -125,20 +133,20 @@ def _datetime(
125133 if not parsed :
126134 raise ValueError (f"Bad time string: { repr (scalar )} " )
127135
128- hours = parsed .group ("hours" )
129- minutes = parsed .group ("minutes" )
130- seconds = parsed .group ("seconds" )
136+ hour = parsed .group ("hours" )
137+ minute = parsed .group ("minutes" )
138+ second = parsed .group ("seconds" )
131139 fraction = parsed .group ("fraction" )
132- microseconds = int (fraction .ljust (6 , "0" )[:6 ]) if fraction else 0
133- return datetime . datetime (
134- 1970 ,
135- 1 ,
136- 1 ,
137- int (hours ),
138- int (minutes ) if minutes else 0 ,
139- int (seconds ) if seconds else 0 ,
140- microseconds ,
141- )
140+ nanosecond = int (fraction .ljust (9 , "0" )[:9 ]) if fraction else 0
141+ return pandas . Timestamp (
142+ year = 1970 ,
143+ month = 1 ,
144+ day = 1 ,
145+ hour = int (hour ),
146+ minute = int (minute ) if minute else 0 ,
147+ second = int (second ) if second else 0 ,
148+ nanosecond = nanosecond ,
149+ ). to_datetime64 ()
142150 else :
143151 raise TypeError ("Invalid value type" , scalar )
144152
@@ -225,23 +233,25 @@ class DateArray(core.BaseDatetimeArray):
225233 def _datetime (
226234 scalar ,
227235 match_fn = re .compile (r"\s*(?P<year>\d+)-(?P<month>\d+)-(?P<day>\d+)\s*$" ).match ,
228- ):
236+ ) -> Optional [ numpy . datetime64 ] :
229237 # Convert pyarrow values to datetime.date.
230238 if isinstance (scalar , (pyarrow .Date32Scalar , pyarrow .Date64Scalar )):
231239 scalar = scalar .as_py ()
232240
233241 if scalar is None :
234242 return None
235243 elif isinstance (scalar , datetime .date ):
236- return datetime .datetime (scalar .year , scalar .month , scalar .day )
244+ return pandas .Timestamp (
245+ year = scalar .year , month = scalar .month , day = scalar .day
246+ ).to_datetime64 ()
237247 elif isinstance (scalar , str ):
238248 match = match_fn (scalar )
239249 if not match :
240250 raise ValueError (f"Bad date string: { repr (scalar )} " )
241251 year = int (match .group ("year" ))
242252 month = int (match .group ("month" ))
243253 day = int (match .group ("day" ))
244- return datetime . datetime (year , month , day )
254+ return pandas . Timestamp (year = year , month = month , day = day ). to_datetime64 ( )
245255 else :
246256 raise TypeError ("Invalid value type" , scalar )
247257
0 commit comments