为何pandas-market-calendars报错ValueError:values dtype需为datetime64[ns]
问题描述
我严格按照pandas-market-calendars官方示例运行代码:
import pandas_market_calendars as mcal # 创建日历 nyse = mcal.get_calendar('NYSE') # 显示可用日历 print(mcal.get_calendar_names()) early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10') print(early)
本该输出NYSE交易时间表,却报错:
ValueError: The dtype of 'values' is incorrect. Must be 'datetime64[ns]'. Got object instead.
完整报错回溯:
Traceback (most recent call last): File "D:/Strawberry/Strawberry_Omega/tests/pandas_mkt_clndr_test.py", line 9, in <module> early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10') File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas_market_calendars\market_calendar.py", line 632, in schedule adjusted = schedule.loc[_close_adj].apply( File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\frame.py", line 7547, in apply return op.get_result() File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 180, in get_result return self.apply_standard() File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 255, in apply_standard results, res_index = self.apply_series_generator() File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 284, in apply_series_generator results[i] = self.f(v) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas_market_calendars\market_calendar.py", line 633, in <lambda> lambda x: x.where(x.le(x["market_close"]), x["market_close"]), axis= 1) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 9001, in where return self._where( File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 8741, in _where cond, _ = cond.align(self, join="right", broadcast_axis=1) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\series.py", line 4274, in align return super().align( File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 8556, in align return self._align_series( File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 8664, in _align_series right = other._reindex_indexer(join_index, ridx, copy) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\series.py", line 4241, in _reindex_indexer return self.copy() File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 5660, in copy data = self._mgr.copy(deep=deep) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\managers.py", line 802, in copy res = self.apply("copy", deep=deep) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\managers.py", line 406, in apply applied = getattr(b, f)(**kwargs) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\blocks.py", line 679, in copy return self.make_block_same_class(values, ndim=self.ndim) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\blocks.py", line 261, in make_block_same_class return type(self)(values, placement=placement, ndim=ndim) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\blocks.py", line 1544, in __init__ values = self._maybe_coerce_values(values) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\blocks.py", line 2170, in _maybe_coerce_values values = self._holder(values) File "C:\Users\Wes\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\arrays\datetimes.py", line 254, in __init__ raise ValueError( ValueError: The dtype of 'values' is incorrect. Must be 'datetime64[ns]'. Got object instead.
我输入的日期格式和示例完全一致,其他人运行没问题,请问这是哪里出问题了?
解决方法
这个错误不是你输入的日期格式问题,而是pandas-market-calendars和你当前安装的pandas版本不兼容导致的。从报错栈看,你用的是Python3.8 + pandas旧版本,而pandas-market-calendars的新版本在处理datetime类型时依赖更高版本的pandas特性。
你可以通过以下几种方式解决:
- 升级pandas版本:
执行命令:
建议升级到1.3.x及以上版本,确保和pip install --upgrade pandaspandas-market-calendars兼容。 - 降级pandas-market-calendars到兼容版本:
如果不想升级pandas,可以安装旧版本的库,比如:
这个版本对旧pandas的兼容性更好。pip install pandas-market-calendars==3.3 - 临时 workaround:手动转换日期类型:
把日期字符串手动转为pandas的datetime对象再传入,也能绕过这个问题:import pandas as pd import pandas_market_calendars as mcal nyse = mcal.get_calendar('NYSE') print(mcal.get_calendar_names()) # 手动转为datetime类型 start = pd.to_datetime('2012-07-01') end = pd.to_datetime('2012-07-10') early = nyse.schedule(start_date=start, end_date=end) print(early)
内容的提问来源于stack exchange,提问作者wdsky
相关产品推荐
相关产品推荐

