124 lines
4.2 KiB
Python
124 lines
4.2 KiB
Python
from datetime import timezone
|
|
|
|
import pytest
|
|
import pytz
|
|
|
|
from pandas._libs.tslibs import timezones
|
|
|
|
from pandas import (
|
|
DatetimeIndex,
|
|
NaT,
|
|
Series,
|
|
Timestamp,
|
|
date_range,
|
|
)
|
|
import pandas._testing as tm
|
|
|
|
|
|
class TestTZLocalize:
|
|
def test_series_tz_localize_ambiguous_bool(self):
|
|
# make sure that we are correctly accepting bool values as ambiguous
|
|
|
|
# GH#14402
|
|
ts = Timestamp("2015-11-01 01:00:03")
|
|
expected0 = Timestamp("2015-11-01 01:00:03-0500", tz="US/Central")
|
|
expected1 = Timestamp("2015-11-01 01:00:03-0600", tz="US/Central")
|
|
|
|
ser = Series([ts])
|
|
expected0 = Series([expected0])
|
|
expected1 = Series([expected1])
|
|
|
|
with tm.external_error_raised(pytz.AmbiguousTimeError):
|
|
ser.dt.tz_localize("US/Central")
|
|
|
|
result = ser.dt.tz_localize("US/Central", ambiguous=True)
|
|
tm.assert_series_equal(result, expected0)
|
|
|
|
result = ser.dt.tz_localize("US/Central", ambiguous=[True])
|
|
tm.assert_series_equal(result, expected0)
|
|
|
|
result = ser.dt.tz_localize("US/Central", ambiguous=False)
|
|
tm.assert_series_equal(result, expected1)
|
|
|
|
result = ser.dt.tz_localize("US/Central", ambiguous=[False])
|
|
tm.assert_series_equal(result, expected1)
|
|
|
|
def test_series_tz_localize_matching_index(self):
|
|
# Matching the index of the result with that of the original series
|
|
# GH 43080
|
|
dt_series = Series(
|
|
date_range(start="2021-01-01T02:00:00", periods=5, freq="1D"),
|
|
index=[2, 6, 7, 8, 11],
|
|
dtype="category",
|
|
)
|
|
result = dt_series.dt.tz_localize("Europe/Berlin")
|
|
expected = Series(
|
|
date_range(
|
|
start="2021-01-01T02:00:00", periods=5, freq="1D", tz="Europe/Berlin"
|
|
),
|
|
index=[2, 6, 7, 8, 11],
|
|
)
|
|
tm.assert_series_equal(result, expected)
|
|
|
|
@pytest.mark.parametrize(
|
|
"method, exp",
|
|
[
|
|
["shift_forward", "2015-03-29 03:00:00"],
|
|
["shift_backward", "2015-03-29 01:59:59.999999999"],
|
|
["NaT", NaT],
|
|
["raise", None],
|
|
["foo", "invalid"],
|
|
],
|
|
)
|
|
def test_tz_localize_nonexistent(self, warsaw, method, exp):
|
|
# GH 8917
|
|
tz = warsaw
|
|
n = 60
|
|
dti = date_range(start="2015-03-29 02:00:00", periods=n, freq="min")
|
|
ser = Series(1, index=dti)
|
|
df = ser.to_frame()
|
|
|
|
if method == "raise":
|
|
with tm.external_error_raised(pytz.NonExistentTimeError):
|
|
dti.tz_localize(tz, nonexistent=method)
|
|
with tm.external_error_raised(pytz.NonExistentTimeError):
|
|
ser.tz_localize(tz, nonexistent=method)
|
|
with tm.external_error_raised(pytz.NonExistentTimeError):
|
|
df.tz_localize(tz, nonexistent=method)
|
|
|
|
elif exp == "invalid":
|
|
msg = (
|
|
"The nonexistent argument must be one of "
|
|
"'raise', 'NaT', 'shift_forward', 'shift_backward' "
|
|
"or a timedelta object"
|
|
)
|
|
with pytest.raises(ValueError, match=msg):
|
|
dti.tz_localize(tz, nonexistent=method)
|
|
with pytest.raises(ValueError, match=msg):
|
|
ser.tz_localize(tz, nonexistent=method)
|
|
with pytest.raises(ValueError, match=msg):
|
|
df.tz_localize(tz, nonexistent=method)
|
|
|
|
else:
|
|
result = ser.tz_localize(tz, nonexistent=method)
|
|
expected = Series(1, index=DatetimeIndex([exp] * n, tz=tz))
|
|
tm.assert_series_equal(result, expected)
|
|
|
|
result = df.tz_localize(tz, nonexistent=method)
|
|
expected = expected.to_frame()
|
|
tm.assert_frame_equal(result, expected)
|
|
|
|
res_index = dti.tz_localize(tz, nonexistent=method)
|
|
tm.assert_index_equal(res_index, expected.index)
|
|
|
|
@pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
|
|
def test_series_tz_localize_empty(self, tzstr):
|
|
# GH#2248
|
|
ser = Series(dtype=object)
|
|
|
|
ser2 = ser.tz_localize("utc")
|
|
assert ser2.index.tz == timezone.utc
|
|
|
|
ser2 = ser.tz_localize(tzstr)
|
|
timezones.tz_compare(ser2.index.tz, timezones.maybe_get_tz(tzstr))
|