from datetime import (
|
datetime,
|
timedelta,
|
)
|
|
import pytz
|
|
from pandas._libs.tslibs.timezones import dateutil_gettz as gettz
|
import pandas.util._test_decorators as td
|
|
from pandas import Timestamp
|
import pandas._testing as tm
|
|
|
class TestTimestampToPyDatetime:
|
def test_to_pydatetime_fold(self):
|
# GH#45087
|
tzstr = "dateutil/usr/share/zoneinfo/America/Chicago"
|
ts = Timestamp(year=2013, month=11, day=3, hour=1, minute=0, fold=1, tz=tzstr)
|
dt = ts.to_pydatetime()
|
assert dt.fold == 1
|
|
def test_to_pydatetime_nonzero_nano(self):
|
ts = Timestamp("2011-01-01 9:00:00.123456789")
|
|
# Warn the user of data loss (nanoseconds).
|
with tm.assert_produces_warning(UserWarning):
|
expected = datetime(2011, 1, 1, 9, 0, 0, 123456)
|
result = ts.to_pydatetime()
|
assert result == expected
|
|
def test_timestamp_to_datetime(self):
|
stamp = Timestamp("20090415", tz="US/Eastern")
|
dtval = stamp.to_pydatetime()
|
assert stamp == dtval
|
assert stamp.tzinfo == dtval.tzinfo
|
|
def test_timestamp_to_pydatetime_dateutil(self):
|
stamp = Timestamp("20090415", tz="dateutil/US/Eastern")
|
dtval = stamp.to_pydatetime()
|
assert stamp == dtval
|
assert stamp.tzinfo == dtval.tzinfo
|
|
def test_timestamp_to_pydatetime_explicit_pytz(self):
|
stamp = Timestamp("20090415", tz=pytz.timezone("US/Eastern"))
|
dtval = stamp.to_pydatetime()
|
assert stamp == dtval
|
assert stamp.tzinfo == dtval.tzinfo
|
|
@td.skip_if_windows
|
def test_timestamp_to_pydatetime_explicit_dateutil(self):
|
stamp = Timestamp("20090415", tz=gettz("US/Eastern"))
|
dtval = stamp.to_pydatetime()
|
assert stamp == dtval
|
assert stamp.tzinfo == dtval.tzinfo
|
|
def test_to_pydatetime_bijective(self):
|
# Ensure that converting to datetime and back only loses precision
|
# by going from nanoseconds to microseconds.
|
exp_warning = None if Timestamp.max.nanosecond == 0 else UserWarning
|
with tm.assert_produces_warning(exp_warning):
|
pydt_max = Timestamp.max.to_pydatetime()
|
|
assert (
|
Timestamp(pydt_max).as_unit("ns")._value / 1000
|
== Timestamp.max._value / 1000
|
)
|
|
exp_warning = None if Timestamp.min.nanosecond == 0 else UserWarning
|
with tm.assert_produces_warning(exp_warning):
|
pydt_min = Timestamp.min.to_pydatetime()
|
|
# The next assertion can be enabled once GH#39221 is merged
|
# assert pydt_min < Timestamp.min # this is bc nanos are dropped
|
tdus = timedelta(microseconds=1)
|
assert pydt_min + tdus > Timestamp.min
|
|
assert (
|
Timestamp(pydt_min + tdus).as_unit("ns")._value / 1000
|
== Timestamp.min._value / 1000
|
)
|