La salida de pd.infer_freq
es "D" mientras que pd.to_timedelta
espera "1D".
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 = Timedelta ('1 día 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()
cometer: Ninguno
python: 2.7.12.final.0
bits de pitón: 64
SO: Linux
Versión del SO: 4.4.0-42-genérico
máquina: x86_64
procesador: x86_64
byteorder: pequeño
LC_ALL: Ninguno
IDIOMA: en_US.UTF-8
pandas: 0.18.1
nariz: 1.3.7
pip: 8.1.2
herramientas de configuración: 26.1.1
Cython: 0.24.1
numpy: 1.11.1
scipy: 0.18.0
statsmodels: 0.6.1
xarray: Ninguno
IPython: 5.1.0
esfinge: 1.4.1
chivo expiatorio: 0.4.1
dateutil: 2.5.3
pytz: 2016.6.1
blosc: Ninguno
cuello de botella: 1.1.0
tablas: 3.2.3.1
numexpr: 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: Ninguno
httplib2: Ninguno
apiclient: Ninguno
sqlalchemy: 1.0.13
pymysql: Ninguno
psycopg2: Ninguno
jinja2: 2.8
boto: 2.40.0
pandas_datareader: Ninguno
pd.to_timedelta
solo puede manejar deltas fijos (básicamente días y más finos); no es una garantía de API que las cadenas de frecuencia se puedan analizar como un delta y, de hecho, algunas frecuencias no se pueden convertir en un timedelta.
In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)
In [255]: pd.infer_freq(dates)
Out[255]: 'B'
Si necesita convertir una cadena de frecuencia en un objeto DateOffset
, que puede ser un delta fijo o relativo, use la función 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>
Por cierto, puede convertir dicho desplazamiento en un timedelta para ciertos tipos:
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'>
(o alternativa to_offset('D').delta
)
Como @ chris-b1 señaló anteriormente, las compensaciones relativas no se pueden convertir en un timedelta, por lo que esto también genera errores.
¡Gracias por los comentarios! Tiene sentido ahora.
Comentario más útil
pd.to_timedelta
solo puede manejar deltas fijos (básicamente días y más finos); no es una garantía de API que las cadenas de frecuencia se puedan analizar como un delta y, de hecho, algunas frecuencias no se pueden convertir en un timedelta.Si necesita convertir una cadena de frecuencia en un objeto
DateOffset
, que puede ser un delta fijo o relativo, use la funciónto_offset
.