La sortie de pd.infer_freq
est "D" tandis que pd.to_timedelta
attend "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 jours 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 : aucun
python : 2.7.12.final.0
bits python : 64
Système d'exploitation : Linux
Version du système d'exploitation : 4.4.0-42-generic
ordinateur : x86_64
processeur : x86_64
ordre des octets : peu
LC_ALL : aucun
LANGUE : en_US.UTF-8
pandas : 0,18.1
nez : 1.3.7
pépin : 8.1.2
outils de configuration : 26.1.1
Cython : 0.24.1
numpy : 1.11.1
scipy: 0.18.0
modèles de statistiques : 0.6.1
xarray : aucun
IPython : 5.1.0
sphinx : 1.4.1
patsy : 0.4.1
dateutil: 2.5.3
pytz : 2016.6.1
bloc : aucun
goulot d'étranglement : 1.1.0
tableaux : 3.2.3.1
exprnum : 2.6.1
matplotlib : 1.5.1
openpyxl: 2.3.2
xlrd : 1.0.0
XL : 1.1.2
xlsxwriter : 0.9.2
lxml : 3.6.4
bs4 : 4.4.1
html5lib : aucun
httplib2 : aucun
client api : aucun
sqlalchimie : 1.0.13
pymysql : aucun
psycopg2 : aucun
jinja2 : 2,8
jusqu'à : 2.40.0
pandas_datareader : aucun
pd.to_timedelta
ne peut gérer que des deltas fixes (essentiellement des jours et plus fins) - ce n'est pas une garantie API que les chaînes de fréquence peuvent être analysées comme un delta, et en fait, certaines fréquences ne peuvent pas être converties en un delta de temps.
In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)
In [255]: pd.infer_freq(dates)
Out[255]: 'B'
Si vous devez convertir une chaîne de fréquence en un objet DateOffset
, qui peut être un delta fixe ou relatif, utilisez la fonction 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, vous pouvez convertir un tel décalage en timedelta pour certains types :
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 alternative to_offset('D').delta
)
Comme @chris-b1 l'a noté ci-dessus, les décalages relatifs ne peuvent pas être convertis en timedelta, ce qui entraîne également des erreurs.
Merci pour les commentaires! Cela a du sens maintenant.
Commentaire le plus utile
pd.to_timedelta
ne peut gérer que des deltas fixes (essentiellement des jours et plus fins) - ce n'est pas une garantie API que les chaînes de fréquence peuvent être analysées comme un delta, et en fait, certaines fréquences ne peuvent pas être converties en un delta de temps.Si vous devez convertir une chaîne de fréquence en un objet
DateOffset
, qui peut être un delta fixe ou relatif, utilisez la fonctionto_offset
.