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

如何将DataFrame的DateTimeIndex转换为日期索引?

问题:将DataFrame的DateTimeIndex转换为日期索引

原始代码与数据结构

import pandas as pd
data = pd.read_csv('EURUSD=X.csv')
data['DateTime'] = pd.to_datetime(data['Gmt time'])
data = data.set_index('DateTime')

生成的DataFrame结构如下:

DateTimeOpenHighLowCloseVolume
2003-04-05 21:00:001.122841.123381.122421.1230529059.0996
2003-04-05 22:00:001.122741.123021.122261.1224126091.8008
2003-04-05 23:00:001.122351.122351.121601.1216929240.9004
2003-05-05 00:00:001.121611.123141.121541.1225829914.8008
2003-05-05 01:00:001.122321.122621.120991.1214028370.6992

尝试的代码及错误

  • 第一次尝试:
data['Day'] = data.date()

错误信息:AttributeError: 'DataFrame' object has no attribute 'date'

  • 第二次尝试:
data.groupby(["Day"])["close"]

错误信息:KeyError: 'Day'

期望输出

Open    High    Low  Close     Volume
DateTime                    
2003-04-05  1.12284 1.12338 1.12242 1.12305 29059.0996
2003-04-05  1.12274 1.12302 1.12226 1.12241 26091.8008
2003-04-05  1.12235 1.12235 1.12160 1.12169 29240.9004
2003-05-05  1.12161 1.12314 1.12154 1.12258 29914.8008
2003-05-05  1.12232 1.12262 1.12099 1.12140 28370.6992

解决方案

要将DateTimeIndex转换为仅含日期的索引,需针对索引对象操作,而非整个DataFrame,以下是几种可行方法:

方法1:直接替换原索引(最简洁)

直接将DateTimeIndex转换为日期类型,去除时间部分:

data.index = data.index.date

执行后索引会变为datetime.date类型,完全匹配你的期望输出。

方法2:先新增日期列再设置索引(保留原索引可选)

如果需要保留原时间索引,可以先新增日期列,再按需设置为新索引:

# 添加日期列
data['Day'] = data.index.date
# 可选:将Day设为新索引替换原DateTime
data = data.set_index('Day')

方法3:按日期分组聚合(若需统计每日数据)

如果最终目的是按日期计算聚合值(比如每日收盘价均值),无需单独修改索引,直接用索引的date属性分组即可:

# 按日期分组,计算Close列的每日均值
daily_close_avg = data.groupby(data.index.date)['Close'].mean()

错误原因说明

  • data.date()报错:date()是DatetimeIndex的方法,不是DataFrame的方法,正确写法是data.index.date。
  • KeyError: 'Day'报错:因为尚未创建Day列,无法用不存在的列分组,需先创建该列或直接用索引属性分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:56:07