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
相关产品推荐
相关产品推荐

