Как решить неоднозначную временную ошибку в анализе временных рядов с пандами - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь обработать некоторые данные датчика, для которых анализ местного времени имеет большое значение для анализа.Смотрите следующий пример анализа (любезно предоставленный ответ @Alloz в предыдущем вопросе).Этот код с указанным часовым поясом приводит к неоднозначной ошибке времени.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

dates = pd.date_range(start='2018-10-20', end='2018-11-05', freq='min', tz='US/Central')
vals = np.random.rand(len(dates))
df = pd.DataFrame(data={'dates': dates, 'vals': vals})
df.set_index('dates', inplace=True)

df1 = (df.groupby([np.where(df.index.weekday < 5, 'weekday', 'weekend'),
                   df.index.floor('10min').time])
         .mean()
         .rename(columns={'vals': 'average'}))

fig, ax = plt.subplots(figsize=(12,7))
df1.unstack(0).plot(ax=ax)  
# Plot Full Average
df.groupby(df.index.floor('10min').time).mean().rename(columns={'vals': 'average'}).plot(ax=ax)
plt.show()

(полный обратный отсчет приведен ниже) вызов df.index.floor завершается ошибкой со следующим сообщением:

AmbiguousTimeError: Cannot infer dst time from '2018-11-04 01:00:00', try using the 'ambiguous' argument

Что такоеподходящий способ справиться с этим?Я полагаю, что можно попытаться отфильтровать неоднозначные временные метки и просто игнорировать их.Каков наилучший способ сделать это, или есть лучший способ справиться с такого рода сценарием?

---------------------------------------------------------------------------
AmbiguousTimeError                        Traceback (most recent call last)
<ipython-input-27-31fa6e75660b> in <module>
      1 df1 = (df.groupby([np.where(df.index.weekday < 5, 'weekday', 'weekend'),
----> 2                    df.index.floor('10min').time])
      3          .mean()
      4          .rename(columns={'vals': 'average'}))
      5 

C:\Miniconda3\lib\site-packages\pandas\core\indexes\datetimelike.py in floor(self, freq)
    200     @Appender((_round_doc + _floor_example).format(op="floor"))
    201     def floor(self, freq):
--> 202         return self._round(freq, np.floor)
    203 
    204     @Appender((_round_doc + _ceil_example).format(op="ceil"))

C:\Miniconda3\lib\site-packages\pandas\core\indexes\datetimelike.py in _round(self, freq, rounder)
    192             attribs['tz'] = None
    193         return self._ensure_localized(
--> 194             self._shallow_copy(result, **attribs))
    195 
    196     @Appender((_round_doc + _round_example).format(op="round"))

C:\Miniconda3\lib\site-packages\pandas\core\indexes\datetimelike.py in _ensure_localized(self, result)
    350             if not isinstance(result, ABCIndexClass):
    351                 result = self._simple_new(result)
--> 352             result = result.tz_localize(self.tz)
    353         return result
    354 

C:\Miniconda3\lib\site-packages\pandas\core\indexes\datetimes.py in tz_localize(self, tz, ambiguous, errors)
   2384             new_dates = conversion.tz_localize_to_utc(self.asi8, tz,
   2385                                                       ambiguous=ambiguous,
-> 2386                                                       errors=errors)
   2387         new_dates = new_dates.view(_NS_DTYPE)
   2388         return self._shallow_copy(new_dates, tz=tz)

pandas\_libs\tslibs\conversion.pyx in pandas._libs.tslibs.conversion.tz_localize_to_utc()

AmbiguousTimeError: Cannot infer dst time from '2018-11-04 01:00:00', try using the 'ambiguous' argument
which is the moment when the clocks fall back an hour for Daylight savi
...