Pandas: Incompatibilité entre pandas.infer_freq et pandas.to_timedelta

Créé le 11 oct. 2016  ·  3Commentaires  ·  Source: pandas-dev/pandas

Un petit exemple complet du problème

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)

Production attendue

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

Sortie de pd.show_versions()

VERSIONS INSTALLÉES

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

Frequency Usage Question

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.

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>

Tous les 3 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes