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)
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
pd.show_versions()
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
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.
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.Wenn Sie eine Häufigkeitszeichenfolge in ein
DateOffset
Objekt konvertieren müssen, das ein festes oder relatives Delta sein kann, verwenden Sie die Funktionto_offset
.