我从“日期”列创建了DatetimeIndex:
sales.index = pd.DatetimeIndex(sales["date"])
现在索引如下:
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-04', '2003-01-06',
'2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10',
'2003-01-11', '2003-01-13',
...
'2016-07-22', '2016-07-23', '2016-07-24', '2016-07-25',
'2016-07-26', '2016-07-27', '2016-07-28', '2016-07-29',
'2016-07-30', '2016-07-31'],
dtype='datetime64[ns]', name='date', length=4393, freq=None)
如您所见,freq
属性为None。我怀疑路上的错误是由丢失的freq
引起的。但是,如果我试图显式设置频率:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-148-30857144de81> in <module>()
1 #### DEBUG
----> 2 sales_train = disentangle(df_train)
3 sales_holdout = disentangle(df_holdout)
4 result = sarima_fit_predict(sales_train.loc[5002, 9990]["amount_sold"], sales_holdout.loc[5002, 9990]["amount_sold"])
<ipython-input-147-08b4c4ecdea3> in disentangle(df_train)
2 # transform sales table to disentangle sales time series
3 sales = df_train[["date", "store_id", "article_id", "amount_sold"]]
----> 4 sales.index = pd.DatetimeIndex(sales["date"], freq="d")
5 sales = sales.pivot_table(index=["store_id", "article_id", "date"])
6 return sales
/usr/local/lib/python3.6/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
89 else:
90 kwargs[new_arg_name] = new_arg_value
---> 91 return func(*args, **kwargs)
92 return wrapper
93 return _deprecate_kwarg
/usr/local/lib/python3.6/site-packages/pandas/core/indexes/datetimes.py in __new__(cls, data, freq, start, end, periods, copy, name, tz, verify_integrity, normalize, closed, ambiguous, dtype, **kwargs)
399 'dates does not conform to passed '
400 'frequency {1}'
--> 401 .format(inferred, freq.freqstr))
402
403 if freq_infer:
ValueError: Inferred frequency None from passed dates does not conform to passed frequency D
很显然,已经推断出了一个频率,但它既没有存储在DatetimeIndex的freq
属性中,也没有存储在inferred_freq
属性中——两者都不是。有人能把混乱弄清楚吗?
我不确定早期版本的python是否有这个功能,但是3.6有这个简单的解决方案:
你有两个选择:
pd.infer_freq
pd.tseries.frequencies.to_offset
你完全正确。以下是我经常使用的:
例如:
使用
asfreq
实际上会重新索引(填充)丢失的日期,因此如果这不是您要查找的,请小心。它似乎与失踪日期有关,如3kt所述。正如EdChum所建议的那样,您可以使用
asfreq('D')
来“修复”,但这会给您一个缺少数据值的连续索引。对于我制作的一些示例数据,它工作得很好:注意
freq=None
。如果应用asfreq('D')
,则会更改为freq='D'
:更一般地说,并且取决于您到底要做什么,您可能需要检查以下其他选项,例如重新索引和重新采样:Add missing dates to pandas dataframe
相关问题 更多 >
编程相关推荐