Pandas: pandas.infer_freq 和 pandas.to_timedelta 之间的不兼容

创建于 2016-10-11  ·  3评论  ·  资料来源: pandas-dev/pandas

问题的一个小而完整的例子

pd.infer_freq的输出是“D”,而pd.to_timedelta “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 天 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()

已安装的版本

提交:无
蟒蛇:2.7.12.final.0
蟒蛇位:64
操作系统:Linux
操作系统版本:4.4.0-42-generic
机器:x86_64
处理器:x86_64
字节序:小
LC_ALL:无
语言:en_US.UTF-8

熊猫:0.18.1
鼻子:1.3.7
点数:8.1.2
设置工具:26.1.1
赛通:0.24.1
麻木:1.11.1
scipy:0.18.0
统计模型:0.6.1
xarray:无
IPython:5.1.0
狮身人面像:1.4.1
帕齐:0.4.1
日期工具:2.5.3
pytz:2016.6.1
块:无
瓶颈:1.1.0
表:3.2.3.1
数字表达式: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:无
httplib2:无
apiclient: 无
sqlalchemy:1.0.13
pymysql:无
psycopg2:无
jinja2:2.8
博托:2.40.0
pandas_datareader:无

Frequency Usage Question

最有用的评论

pd.to_timedelta只能处理固定的增量(基本上是几天或更细)——它不是 API 保证可以将频率字符串解析为增量,实际上某些频率不能转换为时间增量。

In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)

In [255]: pd.infer_freq(dates)
Out[255]: 'B'

如果您需要将频率字符串转换为DateOffset对象(可以是固定或相对增量),请使用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>

所有3条评论

pd.to_timedelta只能处理固定的增量(基本上是几天或更细)——它不是 API 保证可以将频率字符串解析为增量,实际上某些频率不能转换为时间增量。

In [254]: dates = pd.bdate_range(start='2014-01-01', periods=10)

In [255]: pd.infer_freq(dates)
Out[255]: 'B'

如果您需要将频率字符串转换为DateOffset对象(可以是固定或相对增量),请使用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>

顺便说一句,您可以将此类偏移量转换为某些类型的时间增量:

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'>

(或替代to_offset('D').delta
正如@chris-b1 上面提到的,相对偏移不能转换为时间增量,所以这也会出错。

谢谢你的意见! 现在说得通了。

此页面是否有帮助?
0 / 5 - 0 等级