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

DuckDB存储股票数据时日期带时间戳:如何去除时间部分?

解决DuckDB中股票日期带时间戳的问题

核心原因

问题本质是表的Date列类型被自动推断为TIMESTAMP,而非DATE类型——即使你在Pandas里转成date或插入时做CAST,最终存储的还是带时间戳的格式。

具体解决方案

1. 提前显式创建带DATE类型的表

插入数据前手动创建表,指定Date列为DATE类型,避免DuckDB自动推断错误:

CREATE TABLE IF NOT EXISTS stock_prices (
    Date DATE,
    Open DOUBLE,
    High DOUBLE,
    Low DOUBLE,
    Close DOUBLE,
    Adj_Close DOUBLE,
    Volume BIGINT
);

2. 插入数据时强制类型匹配

如果用Pandas的to_sql插入,除了把Date列转为dt.date,还要显式指定SQL列类型:

import pandas as pd
import duckdb
from sqlalchemy.types import DATE

# 处理Yahoo Finance获取的DataFrame
df['Date'] = df['Date'].dt.date

# 连接数据库并插入
con = duckdb.connect('stock_db.db')
df.to_sql(
    'stock_prices',
    con=con,
    if_exists='append',
    index=False,
    dtype={'Date': DATE()}  # 强制指定Date列为DATE类型
)
con.close()

3. 修正已存在的带时间戳数据

如果表已创建且数据已插入,直接修改列类型即可:

ALTER TABLE stock_prices ALTER COLUMN Date TYPE DATE;

若上述命令报错(如存在隐式转换问题),可通过新表迁移数据:

-- 创建转换后的新表
CREATE TABLE stock_prices_clean AS 
SELECT 
    DATE(Date) AS Date,
    Open, High, Low, Close, Adj_Close, Volume
FROM stock_prices;

-- 替换原表
DROP TABLE stock_prices;
ALTER TABLE stock_prices_clean RENAME TO stock_prices;

验证结果

执行查询确认日期格式:

SELECT Date FROM stock_prices LIMIT 5;

此时Date列将显示为2024-01-02格式,无时间戳。

内容的提问来源于stack exchange,提问作者Alex_w

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:57:41