You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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特性。

你可以通过以下几种方式解决:

  1. 升级pandas版本:
    执行命令:
    pip install --upgrade pandas
    
    建议升级到1.3.x及以上版本,确保和pandas-market-calendars兼容。
  2. 降级pandas-market-calendars到兼容版本:
    如果不想升级pandas,可以安装旧版本的库,比如:
    pip install pandas-market-calendars==3.3
    
    这个版本对旧pandas的兼容性更好。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:25:17