如何将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结构如下:
| DateTime | Open | High | Low | Close | Volume |
|---|---|---|---|---|---|
| 2003-04-05 21:00:00 | 1.12284 | 1.12338 | 1.12242 | 1.12305 | 29059.0996 |
| 2003-04-05 22:00:00 | 1.12274 | 1.12302 | 1.12226 | 1.12241 | 26091.8008 |
| 2003-04-05 23:00:00 | 1.12235 | 1.12235 | 1.12160 | 1.12169 | 29240.9004 |
| 2003-05-05 00:00:00 | 1.12161 | 1.12314 | 1.12154 | 1.12258 | 29914.8008 |
| 2003-05-05 01:00:00 | 1.12232 | 1.12262 | 1.12099 | 1.12140 | 28370.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
相关产品推荐
相关产品推荐

