@@ -331,6 +331,92 @@ def test_to_numpy_pandas_date(dtype, expected_dtype):
331
331
)
332
332
333
333
334
+ @pytest .mark .parametrize (
335
+ ("dtype" , "expected_dtype" ),
336
+ [
337
+ # NumPy datetime64 types. Only unit 's'/'ms'/'us'/'ns' are supported.
338
+ pytest .param ("datetime64[s]" , "datetime64[s]" , id = "datetime64[s]" ),
339
+ pytest .param ("datetime64[ms]" , "datetime64[ms]" , id = "datetime64[ms]" ),
340
+ pytest .param ("datetime64[us]" , "datetime64[us]" , id = "datetime64[us]" ),
341
+ pytest .param ("datetime64[ns]" , "datetime64[ns]" , id = "datetime64[ns]" ),
342
+ # pandas.DatetimeTZDtype can be given in two ways [tz is required]:
343
+ # 1. pandas.DatetimeTZDtype(unit, tz)
344
+ # 2. String aliases: "datetime64[unit, tz]"
345
+ pytest .param ("datetime64[s, UTC]" , "datetime64[s]" , id = "datetime64[s, tz=UTC]" ),
346
+ pytest .param (
347
+ "datetime64[s, America/New_York]" ,
348
+ "datetime64[s]" ,
349
+ id = "datetime64[s, tz=America/New_York]" ,
350
+ ),
351
+ pytest .param (
352
+ "datetime64[s, +07:30]" , "datetime64[s]" , id = "datetime64[s, +07:30]"
353
+ ),
354
+ # PyArrow timestamp types can be given in two ways [tz is optional]:
355
+ # 1. pd.ArrowDtype(pyarrow.Timestamp(unit, tz=tz))
356
+ # 2. String aliases: "timestamp[unit, tz][pyarrow]"
357
+ pytest .param (
358
+ "timestamp[s][pyarrow]" ,
359
+ "datetime64[s]" ,
360
+ id = "timestamp[s][pyarrow]" ,
361
+ marks = skip_if_no (package = "pyarrow" ),
362
+ ),
363
+ pytest .param (
364
+ "timestamp[ms][pyarrow]" ,
365
+ "datetime64[ms]" ,
366
+ id = "timestamp[ms][pyarrow]" ,
367
+ marks = skip_if_no (package = "pyarrow" ),
368
+ ),
369
+ pytest .param (
370
+ "timestamp[us][pyarrow]" ,
371
+ "datetime64[us]" ,
372
+ id = "timestamp[us][pyarrow]" ,
373
+ marks = skip_if_no (package = "pyarrow" ),
374
+ ),
375
+ pytest .param (
376
+ "timestamp[ns][pyarrow]" ,
377
+ "datetime64[ns]" ,
378
+ id = "timestamp[ns][pyarrow]" ,
379
+ marks = skip_if_no (package = "pyarrow" ),
380
+ ),
381
+ pytest .param (
382
+ "timestamp[s, UTC][pyarrow]" ,
383
+ "datetime64[s]" ,
384
+ id = "timestamp[s, UTC][pyarrow]" ,
385
+ marks = skip_if_no (package = "pyarrow" ),
386
+ ),
387
+ pytest .param (
388
+ "timestamp[s, America/New_York][pyarrow]" ,
389
+ "datetime64[s]" ,
390
+ id = "timestamp[s, America/New_York][pyarrow]" ,
391
+ marks = skip_if_no (package = "pyarrow" ),
392
+ ),
393
+ pytest .param (
394
+ "timestamp[s, +08:00][pyarrow]" ,
395
+ "datetime64[s]" ,
396
+ id = "timestamp[s, +08:00][pyarrow]" ,
397
+ marks = skip_if_no (package = "pyarrow" ),
398
+ ),
399
+ ],
400
+ )
401
+ def test_to_numpy_pandas_datetime (dtype , expected_dtype ):
402
+ """
403
+ Test the _to_numpy function with pandas.Series of datetime types.
404
+ """
405
+ series = pd .Series (
406
+ [pd .Timestamp ("2024-01-02T03:04:05" ), pd .Timestamp ("2024-01-02T03:04:06" )],
407
+ dtype = dtype ,
408
+ )
409
+ result = _to_numpy (series )
410
+ _check_result (result , np .datetime64 )
411
+ assert result .dtype == expected_dtype
412
+
413
+ if "," in str (dtype ): # A hacky solution to decide if the dtype is timezone-aware.
414
+ series = series .dt .tz_convert ("UTC" ) # Convert to UTC if timezone-aware.
415
+ expected_series = series .dt .strftime ("%Y-%m-%dT%H:%M:%S" ).to_list ()
416
+
417
+ npt .assert_array_equal (result , np .array (expected_series , dtype = expected_dtype ))
418
+
419
+
334
420
########################################################################################
335
421
# Test the _to_numpy function with PyArrow arrays.
336
422
#
0 commit comments