A saída de pd.infer_freq
é "D" enquanto 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 dia 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()
commit: Nenhum
python: 2.7.12.final.0
python-bits: 64
SO: Linux
Versão do sistema operacional: 4.4.0-42-genérico
máquina: x86_64
processador: x86_64
byteorder: pouco
LC_ALL: Nenhum
LANG: en_US.UTF-8
pandas: 0.18.1
nariz: 1.3.7
pip: 8.1.2
ferramentas de configuração: 26.1.1
Cython: 0.24.1
numpy: 1.11.1
scipy: 0.18.0
modelos de estatísticas: 0,6.1
xarray: Nenhum
IPython: 5.1.0
esfinge: 1.4.1
patsy: 0.4.1
dateutil: 2.5.3
pytz: 2016.6.1
blosc: Nenhum
gargalo: 1.1.0
tabelas: 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: Nenhum
httpplib2: Nenhum
apiclient: Nenhum
sqlalchemy: 1.0.13
pymysql: Nenhum
psycopg2: Nenhum
jinja2: 2.8
boto: 2.40.0
pandas_datareader: Nenhum
pd.to_timedelta
só pode lidar com deltas fixos (basicamente dias e melhores) - não é uma garantia da API de que as strings de frequência podem ser analisadas como delta e, de fato, algumas frequências não podem ser convertidas em um timedelta.
In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)
In [255]: pd.infer_freq(dates)
Out[255]: 'B'
Se você precisar converter uma string de frequência em um objeto DateOffset
, que pode ser um delta fixo ou relativo, use a função 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>
BTW, você pode converter esse deslocamento em um timedelta para certos 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'>
(ou alternativa to_offset('D').delta
)
Como @ chris-b1 observou acima, os deslocamentos relativos não podem ser convertidos em um timedelta, portanto, isso também apresenta erros.
Obrigado pelos comentários! Agora faz sentido.
Comentários muito úteis
pd.to_timedelta
só pode lidar com deltas fixos (basicamente dias e melhores) - não é uma garantia da API de que as strings de frequência podem ser analisadas como delta e, de fato, algumas frequências não podem ser convertidas em um timedelta.Se você precisar converter uma string de frequência em um objeto
DateOffset
, que pode ser um delta fixo ou relativo, use a funçãoto_offset
.