Как изменить обычную серию времени на экономящую время серию? - PullRequest
2 голосов
/ 03 апреля 2020

Я создаю временной ряд следующим образом:

import pandas as pd
dti = pd.date_range('2020-01-01 00:00', '2021-01-01 00:00', freq='0.25H')

Теперь я хочу изменить этот временной ряд на основе экономии дневного света в Europe/Berlin. Значение: 29 марта 2020 часы подскочили с 29-03-2020 01:59:59 до 29-03-2020 03:00:00, а 25 октября 2020 года часы отскочат на один час назад с 25-10-2020 02:59:59 до 25-10-2020 02:00:00 и т. д.

Я пытался сделать:

dti_CEST = dti.tz_localize(tz='Europe/Berlin', ambiguous='infer')

Но выдает следующее сообщение об ошибке:

 dti_CEST = dti.tz_localize(tz='Europe/Berlin', ambiguous='infer')
Traceback (most recent call last):

  File "<ipython-input-3-cb1d671c16a6>", line 1, in <module>
    dti_CEST = dti.tz_localize(tz='Europe/Berlin', ambiguous='infer')

  File "C:\Users\kashy\Anaconda3\envs\py36\lib\site-packages\pandas\core\accessor.py", line 93, in f
    return self._delegate_method(name, *args, **kwargs)

  File "C:\Users\kashy\Anaconda3\envs\py36\lib\site-packages\pandas\core\indexes\datetimelike.py", line 813, in _delegate_method
    result = operator.methodcaller(name, *args, **kwargs)(self._data)

  File "C:\Users\kashy\Anaconda3\envs\py36\lib\site-packages\pandas\core\arrays\datetimes.py", line 1151, in tz_localize
    self.asi8, tz, ambiguous=ambiguous, nonexistent=nonexistent

  File "pandas\_libs\tslibs\tzconversion.pyx", line 196, in pandas._libs.tslibs.tzconversion.tz_localize_to_utc

AmbiguousTimeError: 2020-10-25 02:00:00

Мой текущий временной ряд dti:

date
#march
2020-03-29 00:00:00
2020-03-29 00:15:00
2020-03-29 00:30:00
2020-03-29 00:45:00
2020-03-29 01:00:00
2020-03-29 01:15:00
2020-03-29 01:30:00
2020-03-29 01:45:00
2020-03-29 02:00:00
2020-03-29 02:15:00
2020-03-29 02:30:00
2020-03-29 02:45:00
2020-03-29 03:00:00
2020-03-29 03:15:00
2020-03-29 03:30:00
2020-03-29 03:45:00
2020-03-29 04:00:00
# october
2020-10-25 00:00:00
2020-10-25 00:15:00
2020-10-25 00:30:00
2020-10-25 00:45:00
2020-10-25 01:00:00
2020-10-25 01:15:00
2020-10-25 01:30:00
2020-10-25 01:45:00
2020-10-25 02:00:00
2020-10-25 02:15:00
2020-10-25 02:30:00
2020-10-25 02:45:00
2020-10-25 03:00:00
2020-10-25 03:15:00
2020-10-25 03:30:00
2020-10-25 03:45:00
2020-10-25 04:00:00

Желаемый вывод

date
    #march
    2020-03-29 00:00:00
    2020-03-29 00:15:00
    2020-03-29 00:30:00
    2020-03-29 00:45:00
    2020-03-29 01:00:00
    2020-03-29 01:15:00
    2020-03-29 01:30:00
    2020-03-29 01:45:00
    2020-03-29 03:00:00 #changed here
    2020-03-29 03:15:00
    2020-03-29 03:30:00
    2020-03-29 03:45:00
    2020-03-29 04:00:00
    2020-03-29 04:15:00
    2020-03-29 04:30:00
    2020-03-29 04:45:00
    2020-03-29 05:00:00
    # october
    2020-10-25 00:00:00
    2020-10-25 00:15:00
    2020-10-25 00:30:00
    2020-10-25 00:45:00
    2020-10-25 01:00:00
    2020-10-25 01:15:00
    2020-10-25 01:30:00
    2020-10-25 01:45:00
    2020-10-25 02:00:00
    2020-10-25 02:15:00
    2020-10-25 02:30:00
    2020-10-25 02:45:00
    2020-10-25 02:00:00 #changed here
    2020-10-25 02:15:00
    2020-10-25 02:30:00
    2020-10-25 02:45:00
    2020-10-25 03:00:00

Как я могу это сделать?

1 Ответ

3 голосов
/ 03 апреля 2020

добавить часовой пояс при создании индекса даты и времени:

dti = pd.date_range('2020-01-01 00:00', '2021-01-01 00:00', freq='0.25H', tz='Europe/Berlin')

dti[8450:]

DatetimeIndex(['2020-03-29 00:30:00+01:00', '2020-03-29 00:45:00+01:00',
               '2020-03-29 01:00:00+01:00', '2020-03-29 01:15:00+01:00',
               '2020-03-29 01:30:00+01:00', '2020-03-29 01:45:00+01:00',
     ------->  '2020-03-29 03:00:00+02:00', '2020-03-29 03:15:00+02:00',
               '2020-03-29 03:30:00+02:00', '2020-03-29 03:45:00+02:00',
               ...
               '2020-12-31 21:45:00+01:00', '2020-12-31 22:00:00+01:00',
               '2020-12-31 22:15:00+01:00', '2020-12-31 22:30:00+01:00',
               '2020-12-31 22:45:00+01:00', '2020-12-31 23:00:00+01:00',
               '2020-12-31 23:15:00+01:00', '2020-12-31 23:30:00+01:00',
               '2020-12-31 23:45:00+01:00', '2021-01-01 00:00:00+01:00'],
              dtype='datetime64[ns, Europe/Berlin]', length=26687, freq='15T')
...