123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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))
|