Pandas: Inkompatibilität zwischen pandas.infer_freq und pandas.to_timedelta

Erstellt am 11. Okt. 2016  ·  3Kommentare  ·  Quelle: pandas-dev/pandas

Ein kleines, vollständiges Beispiel für das Problem

Die Ausgabe von pd.infer_freq ist "D", während pd.to_timedelta "1D" erwartet.

import pandas as pd
dates = pd.date_range(start='2016-10-01', end='2016-10-10', freq='1D')
freq = pd.infer_freq(dates)
delta = pd.to_timedelta(freq)

Erwartete Ausgabe

Delta = Zeitdelta('1 Tage 00:00:00')

>>> import pandas as pd
>>> dates = pd.date_range(start='2016-10-01', end='2016-10-10', freq='1D')
>>> dates
DatetimeIndex(['2016-10-01', '2016-10-02', '2016-10-03', '2016-10-04',
               '2016-10-05', '2016-10-06', '2016-10-07', '2016-10-08',
               '2016-10-09', '2016-10-10'],
              dtype='datetime64[ns]', freq='D')
>>> freq = pd.infer_freq(dates)
>>> freq
'D'
>>> delta = pd.to_timedelta(freq)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/iivanov/anaconda2/lib/python2.7/site-packages/pandas/util/decorators.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/home/iivanov/anaconda2/lib/python2.7/site-packages/pandas/tseries/timedeltas.py", line 102, in to_timedelta
    box=box, errors=errors)
  File "/home/iivanov/anaconda2/lib/python2.7/site-packages/pandas/tseries/timedeltas.py", line 148, in _coerce_scalar_to_timedelta_type
    result = tslib.convert_to_timedelta(r, unit, errors)
  File "pandas/tslib.pyx", line 2941, in pandas.tslib.convert_to_timedelta (pandas/tslib.c:52631)
  File "pandas/tslib.pyx", line 3256, in pandas.tslib.convert_to_timedelta64 (pandas/tslib.c:56028)
  File "pandas/tslib.pyx", line 3188, in pandas.tslib.parse_timedelta_string (pandas/tslib.c:54877)
ValueError: unit abbreviation w/o a number

Ausgabe von pd.show_versions()

INSTALLIERTE VERSIONEN

verpflichten: Keine
Python: 2.7.12.final.0
Python-Bits: 64
Betriebssystem: Linux
OS-Version: 4.4.0-42-generic
Maschine: x86_64
Prozessor: x86_64
Byte-Reihenfolge: wenig
LC_ALL: Keine
SPRACHE: de_US.UTF-8

Pandas: 0.18.1
Nase: 1.3.7
Pip: 8.1.2
Setuptools: 26.1.1
Cython: 0.24.1
numpy: 1.11.1
scipy: 0.18.0
Statistikmodelle: 0.6.1
Röntgenbild: Keine
IPython: 5.1.0
Sphinx: 1.4.1
patsy: 0.4.1
dateutil: 2.5.3
pytz: 2016.6.1
Block: Keine
Engpass: 1.1.0
Tabellen: 3.2.3.1
Anzahlexpr: 2.6.1
Matplotlib: 1.5.1
openpyxl: 2.3.2
xlrd: 1.0.0
xlwt: 1.1.2
xlsxwriter: 0.9.2
lxml: 3.6.4
bs4: 4.4.1
html5lib: Keine
httplib2: Keine
Teilnehmer: Keine
sqlalchemie: 1.0.13
pymysql: Keine
psycopg2: Keine
jinja2: 2.8
boto: 2.40.0
pandas_datareader: Keine

Frequency Usage Question

Hilfreichster Kommentar

pd.to_timedelta kann nur feste Deltas verarbeiten (grundsätzlich Tage und feiner) - es ist keine API-Garantie, dass Frequenzstrings als Delta geparst werden können, und tatsächlich können einige Frequenzen nicht in ein Zeitdelta umgewandelt werden.

In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)

In [255]: pd.infer_freq(dates)
Out[255]: 'B'

Wenn Sie eine Häufigkeitszeichenfolge in ein DateOffset Objekt konvertieren müssen, das ein festes oder relatives Delta sein kann, verwenden Sie die Funktion to_offset .

In [253]: from pandas.tseries.frequencies import to_offset

In [256]: to_offset('D')
Out[256]: <Day>

In [257]: to_offset('2D')
Out[257]: <2 * Days>

In [258]: to_offset('B')
Out[258]: <BusinessDay>

Alle 3 Kommentare

pd.to_timedelta kann nur feste Deltas verarbeiten (grundsätzlich Tage und feiner) - es ist keine API-Garantie, dass Frequenzstrings als Delta geparst werden können, und tatsächlich können einige Frequenzen nicht in ein Zeitdelta umgewandelt werden.

In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)

In [255]: pd.infer_freq(dates)
Out[255]: 'B'

Wenn Sie eine Häufigkeitszeichenfolge in ein DateOffset Objekt konvertieren müssen, das ein festes oder relatives Delta sein kann, verwenden Sie die Funktion to_offset .

In [253]: from pandas.tseries.frequencies import to_offset

In [256]: to_offset('D')
Out[256]: <Day>

In [257]: to_offset('2D')
Out[257]: <2 * Days>

In [258]: to_offset('B')
Out[258]: <BusinessDay>

Übrigens, Sie können einen solchen Offset für bestimmte Typen in ein Zeitdelta umwandeln:

In [19]: pd.to_timedelta(to_offset('D'))
Out[19]: Timedelta('1 days 00:00:00')

In [20]: pd.to_timedelta(to_offset('B'))
...
ValueError: Invalid type for timedelta scalar: <class 'pandas.tseries.offsets.BusinessDay'>

(oder alternativ to_offset('D').delta )
Wie @chris-b1 oben erwähnt, können relative Offsets nicht in ein Zeitdelta umgewandelt werden, daher ist dies auch ein Fehler.

Vielen Dank für die Kommentare! Es macht jetzt Sinn.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

scls19fr picture scls19fr  ·  3Kommentare

songololo picture songololo  ·  3Kommentare

matthiasroder picture matthiasroder  ·  3Kommentare

Ashutosh-Srivastav picture Ashutosh-Srivastav  ·  3Kommentare

ebran picture ebran  ·  3Kommentare