12
12
from __future__ import annotations
13
13
14
14
from collections import abc
15
- import datetime
15
+ from datetime import (
16
+ datetime ,
17
+ timedelta ,
18
+ )
16
19
from io import BytesIO
17
20
import os
18
21
import struct
30
33
)
31
34
import warnings
32
35
33
- from dateutil .relativedelta import relativedelta
34
36
import numpy as np
35
37
36
38
from pandas ._libs import lib
226
228
_date_formats = ["%tc" , "%tC" , "%td" , "%d" , "%tw" , "%tm" , "%tq" , "%th" , "%ty" ]
227
229
228
230
229
- stata_epoch : Final = datetime . datetime (1960 , 1 , 1 )
231
+ stata_epoch : Final = datetime (1960 , 1 , 1 )
230
232
231
233
232
234
# TODO: Add typing. As of January 2020 it is not possible to type this function since
@@ -279,8 +281,8 @@ def _stata_elapsed_date_to_datetime_vec(dates, fmt) -> Series:
279
281
years since 0000
280
282
"""
281
283
MIN_YEAR , MAX_YEAR = Timestamp .min .year , Timestamp .max .year
282
- MAX_DAY_DELTA = (Timestamp .max - datetime . datetime (1960 , 1 , 1 )).days
283
- MIN_DAY_DELTA = (Timestamp .min - datetime . datetime (1960 , 1 , 1 )).days
284
+ MAX_DAY_DELTA = (Timestamp .max - datetime (1960 , 1 , 1 )).days
285
+ MIN_DAY_DELTA = (Timestamp .min - datetime (1960 , 1 , 1 )).days
284
286
MIN_MS_DELTA = MIN_DAY_DELTA * 24 * 3600 * 1000
285
287
MAX_MS_DELTA = MAX_DAY_DELTA * 24 * 3600 * 1000
286
288
@@ -295,9 +297,7 @@ def convert_year_month_safe(year, month) -> Series:
295
297
return to_datetime (100 * year + month , format = "%Y%m" )
296
298
else :
297
299
index = getattr (year , "index" , None )
298
- return Series (
299
- [datetime .datetime (y , m , 1 ) for y , m in zip (year , month )], index = index
300
- )
300
+ return Series ([datetime (y , m , 1 ) for y , m in zip (year , month )], index = index )
301
301
302
302
def convert_year_days_safe (year , days ) -> Series :
303
303
"""
@@ -309,8 +309,7 @@ def convert_year_days_safe(year, days) -> Series:
309
309
else :
310
310
index = getattr (year , "index" , None )
311
311
value = [
312
- datetime .datetime (y , 1 , 1 ) + relativedelta (days = int (d ))
313
- for y , d in zip (year , days )
312
+ datetime (y , 1 , 1 ) + timedelta (days = int (d )) for y , d in zip (year , days )
314
313
]
315
314
return Series (value , index = index )
316
315
@@ -323,12 +322,12 @@ def convert_delta_safe(base, deltas, unit) -> Series:
323
322
index = getattr (deltas , "index" , None )
324
323
if unit == "d" :
325
324
if deltas .max () > MAX_DAY_DELTA or deltas .min () < MIN_DAY_DELTA :
326
- values = [base + relativedelta (days = int (d )) for d in deltas ]
325
+ values = [base + timedelta (days = int (d )) for d in deltas ]
327
326
return Series (values , index = index )
328
327
elif unit == "ms" :
329
328
if deltas .max () > MAX_MS_DELTA or deltas .min () < MIN_MS_DELTA :
330
329
values = [
331
- base + relativedelta (microseconds = (int (d ) * 1000 )) for d in deltas
330
+ base + timedelta (microseconds = (int (d ) * 1000 )) for d in deltas
332
331
]
333
332
return Series (values , index = index )
334
333
else :
@@ -405,7 +404,7 @@ def _datetime_to_stata_elapsed_vec(dates: Series, fmt: str) -> Series:
405
404
Parameters
406
405
----------
407
406
dates : Series
408
- Series or array containing datetime.datetime or datetime64[ns] to
407
+ Series or array containing datetime or datetime64[ns] to
409
408
convert to the Stata Internal Format given by fmt
410
409
fmt : str
411
410
The format to convert to. Can be, tc, td, tw, tm, tq, th, ty
@@ -436,7 +435,7 @@ def parse_dates_safe(
436
435
if delta :
437
436
delta = dates ._values - stata_epoch
438
437
439
- def f (x : datetime . timedelta ) -> float :
438
+ def f (x : timedelta ) -> float :
440
439
return US_PER_DAY * x .days + 1000000 * x .seconds + x .microseconds
441
440
442
441
v = np .vectorize (f )
@@ -447,15 +446,15 @@ def f(x: datetime.timedelta) -> float:
447
446
d ["month" ] = year_month ._values - d ["year" ] * 100
448
447
if days :
449
448
450
- def g (x : datetime . datetime ) -> int :
451
- return (x - datetime . datetime (x .year , 1 , 1 )).days
449
+ def g (x : datetime ) -> int :
450
+ return (x - datetime (x .year , 1 , 1 )).days
452
451
453
452
v = np .vectorize (g )
454
453
d ["days" ] = v (dates )
455
454
else :
456
455
raise ValueError (
457
456
"Columns containing dates must contain either "
458
- "datetime64, datetime.datetime or null values."
457
+ "datetime64, datetime or null values."
459
458
)
460
459
461
460
return DataFrame (d , index = index )
@@ -2291,7 +2290,7 @@ class StataWriter(StataParser):
2291
2290
* If datetimes contain timezone information
2292
2291
ValueError
2293
2292
* Columns listed in convert_dates are neither datetime64[ns]
2294
- or datetime.datetime
2293
+ or datetime
2295
2294
* Column dtype is not representable in Stata
2296
2295
* Column listed in convert_dates is not in DataFrame
2297
2296
* Categorical label contains more than 32,000 characters
@@ -2324,7 +2323,7 @@ def __init__(
2324
2323
convert_dates : dict [Hashable , str ] | None = None ,
2325
2324
write_index : bool = True ,
2326
2325
byteorder : str | None = None ,
2327
- time_stamp : datetime . datetime | None = None ,
2326
+ time_stamp : datetime | None = None ,
2328
2327
data_label : str | None = None ,
2329
2328
variable_labels : dict [Hashable , str ] | None = None ,
2330
2329
compression : CompressionOptions = "infer" ,
@@ -2764,7 +2763,7 @@ def _write_value_labels(self) -> None:
2764
2763
def _write_header (
2765
2764
self ,
2766
2765
data_label : str | None = None ,
2767
- time_stamp : datetime . datetime | None = None ,
2766
+ time_stamp : datetime | None = None ,
2768
2767
) -> None :
2769
2768
byteorder = self ._byteorder
2770
2769
# ds_format - just use 114
@@ -2789,8 +2788,8 @@ def _write_header(
2789
2788
# time stamp, 18 bytes, char, null terminated
2790
2789
# format dd Mon yyyy hh:mm
2791
2790
if time_stamp is None :
2792
- time_stamp = datetime .datetime . now ()
2793
- elif not isinstance (time_stamp , datetime . datetime ):
2791
+ time_stamp = datetime .now ()
2792
+ elif not isinstance (time_stamp , datetime ):
2794
2793
raise ValueError ("time_stamp should be datetime type" )
2795
2794
# GH #13856
2796
2795
# Avoid locale-specific month conversion
@@ -3214,7 +3213,7 @@ class StataWriter117(StataWriter):
3214
3213
* If datetimes contain timezone information
3215
3214
ValueError
3216
3215
* Columns listed in convert_dates are neither datetime64[ns]
3217
- or datetime.datetime
3216
+ or datetime
3218
3217
* Column dtype is not representable in Stata
3219
3218
* Column listed in convert_dates is not in DataFrame
3220
3219
* Categorical label contains more than 32,000 characters
@@ -3250,7 +3249,7 @@ def __init__(
3250
3249
convert_dates : dict [Hashable , str ] | None = None ,
3251
3250
write_index : bool = True ,
3252
3251
byteorder : str | None = None ,
3253
- time_stamp : datetime . datetime | None = None ,
3252
+ time_stamp : datetime | None = None ,
3254
3253
data_label : str | None = None ,
3255
3254
variable_labels : dict [Hashable , str ] | None = None ,
3256
3255
convert_strl : Sequence [Hashable ] | None = None ,
@@ -3295,7 +3294,7 @@ def _update_map(self, tag: str) -> None:
3295
3294
def _write_header (
3296
3295
self ,
3297
3296
data_label : str | None = None ,
3298
- time_stamp : datetime . datetime | None = None ,
3297
+ time_stamp : datetime | None = None ,
3299
3298
) -> None :
3300
3299
"""Write the file header"""
3301
3300
byteorder = self ._byteorder
@@ -3321,8 +3320,8 @@ def _write_header(
3321
3320
# time stamp, 18 bytes, char, null terminated
3322
3321
# format dd Mon yyyy hh:mm
3323
3322
if time_stamp is None :
3324
- time_stamp = datetime .datetime . now ()
3325
- elif not isinstance (time_stamp , datetime . datetime ):
3323
+ time_stamp = datetime .now ()
3324
+ elif not isinstance (time_stamp , datetime ):
3326
3325
raise ValueError ("time_stamp should be datetime type" )
3327
3326
# Avoid locale-specific month conversion
3328
3327
months = [
@@ -3604,7 +3603,7 @@ class StataWriterUTF8(StataWriter117):
3604
3603
* If datetimes contain timezone information
3605
3604
ValueError
3606
3605
* Columns listed in convert_dates are neither datetime64[ns]
3607
- or datetime.datetime
3606
+ or datetime
3608
3607
* Column dtype is not representable in Stata
3609
3608
* Column listed in convert_dates is not in DataFrame
3610
3609
* Categorical label contains more than 32,000 characters
@@ -3641,7 +3640,7 @@ def __init__(
3641
3640
convert_dates : dict [Hashable , str ] | None = None ,
3642
3641
write_index : bool = True ,
3643
3642
byteorder : str | None = None ,
3644
- time_stamp : datetime . datetime | None = None ,
3643
+ time_stamp : datetime | None = None ,
3645
3644
data_label : str | None = None ,
3646
3645
variable_labels : dict [Hashable , str ] | None = None ,
3647
3646
convert_strl : Sequence [Hashable ] | None = None ,
0 commit comments