22
33from collections .abc import Iterable
44from datetime import date
5+ from datetime import datetime
56from functools import partial
67from functools import singledispatch
78from io import BytesIO
@@ -222,13 +223,13 @@ def optional_date_to_string(value: date | str | None) -> str | None:
222223 return datetime_to_date_string (value )
223224
224225
225- def datetime_to_string (value : pd .Timestamp | date | str | int ) -> str :
226+ def datetime_to_string (value : pd .Timestamp | datetime | date | str | int ) -> str :
226227 """
227228 Return a valid datetime string from the given value.
228229
229230 Parameters
230231 ----------
231- value : pd.Timestamp or date or str
232+ value : pd.Timestamp, datetime, date, str, or int
232233 The value to parse.
233234
234235 Returns
@@ -240,6 +241,10 @@ def datetime_to_string(value: pd.Timestamp | date | str | int) -> str:
240241 return value
241242 elif isinstance (value , int ):
242243 return str (value )
244+ elif isinstance (value , date ):
245+ return value .isoformat ()
246+ elif isinstance (value , datetime ):
247+ return value .isoformat ()
243248 else :
244249 return pd .to_datetime (value ).isoformat ()
245250
@@ -250,7 +255,7 @@ def datetime_to_date_string(value: pd.Timestamp | date | str | int) -> str:
250255
251256 Parameters
252257 ----------
253- value : pd.Timestamp or date or str
258+ value : pd.Timestamp, date, str, or int
254259 The value to parse.
255260
256261 Returns
@@ -262,19 +267,21 @@ def datetime_to_date_string(value: pd.Timestamp | date | str | int) -> str:
262267 return value
263268 elif isinstance (value , int ):
264269 return str (value )
270+ elif isinstance (value , date ):
271+ return value .isoformat ()
265272 else :
266273 return pd .to_datetime (value ).date ().isoformat ()
267274
268275
269276def optional_datetime_to_string (
270- value : pd .Timestamp | date | str | int | None ,
277+ value : pd .Timestamp | datetime | date | str | int | None ,
271278) -> str | None :
272279 """
273280 Return a valid datetime string from the given value (if not None).
274281
275282 Parameters
276283 ----------
277- value : pd.Timestamp or date or str , optional
284+ value : pd.Timestamp, datetime, date, str, or int , optional
278285 The value to parse.
279286
280287 Returns
@@ -296,7 +303,7 @@ def datetime_to_unix_nanoseconds(
296303
297304 Parameters
298305 ----------
299- value : pd.Timestamp or date or str or int
306+ value : pd.Timestamp, date, str, or int
300307 The value to parse.
301308
302309 Returns
@@ -306,22 +313,20 @@ def datetime_to_unix_nanoseconds(
306313 """
307314 if isinstance (value , int ):
308315 return value # no checking on integer values
309-
310- if isinstance (value , date ):
316+ elif isinstance (value , date ):
311317 return pd .to_datetime (value , utc = True ).value
312-
313- if isinstance (value , pd .Timestamp ):
318+ elif isinstance (value , pd .Timestamp ):
314319 return value .value
320+ else :
321+ try :
322+ nanoseconds = pd .to_datetime (value , utc = True ).value
323+ except Exception : # different versions of pandas raise different exceptions
324+ nanoseconds = pd .to_datetime (
325+ int (value ),
326+ utc = True ,
327+ ).value
315328
316- try :
317- nanoseconds = pd .to_datetime (value , utc = True ).value
318- except Exception : # different versions of pandas raise different exceptions
319- nanoseconds = pd .to_datetime (
320- int (value ),
321- utc = True ,
322- ).value
323-
324- return nanoseconds
329+ return nanoseconds
325330
326331
327332def optional_datetime_to_unix_nanoseconds (
@@ -333,7 +338,7 @@ def optional_datetime_to_unix_nanoseconds(
333338
334339 Parameters
335340 ----------
336- value : pd.Timestamp or date or str or int
341+ value : pd.Timestamp, date, str, or int
337342 The value to parse.
338343
339344 Returns
0 commit comments