如何在Pandas中通过指定日期索引DataFrame的列值?
问题描述
现有一个Pandas DataFrame,结构如下:
Open High Low Close Volume Dividends Stock Splits Date 2013-01-07 00:00:00-05:00 71.951356 72.440875 71.877924 72.285858 1859400 0.0 0.0 2013-01-08 00:00:00-05:00 72.090030 72.514278 71.151782 71.535240 2173700 0.0 0.0 2013-01-09 00:00:00-05:00 71.926850 72.848777 71.779993 72.661125 2569200 0.0 0.0 ... ... ... ... ... ... ... ... 2023-01-06 00:00:00-05:00 416.200012 428.540009 416.010010 426.470001 1042200 0.0 0.0
查看列名时,发现没有名为Date的列:
>>> for col in stock_df.columns: ... print(col) ... Open High Low Close Volume Dividends Stock Splits
实际Date是DataFrame的索引,而非普通列。需求是:根据%Y-%m-%d格式的日期,快速获取指定列(如Open)的值。
解决方案
1. 确认索引类型
先检查当前索引是否为DatetimeIndex(这是日期查询的前提):
print(type(stock_df.index)) # 正常输出应为 <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
2. 统一时区处理
索引中的-05:00是时区信息,若要按无时区的%Y-%m-%d字符串查询,建议先去除时区:
# 移除时区信息,转为本地datetime stock_df.index = stock_df.index.tz_localize(None)
3. 按日期查询指定列
单日期查询
直接使用loc传入%Y-%m-%d格式的字符串即可:
# 获取2013-01-07的Open值 open_price = stock_df.loc['2013-01-07', 'Open'] print(open_price) # 输出:71.95135572116979
日期范围查询
如果需要批量查询某段日期的列值:
# 获取2013年1月7日至1月10日的Open列数据 open_prices = stock_df.loc['2013-01-07':'2013-01-10', 'Open'] print(open_prices)
带时区的精确匹配
如果保留时区信息,需将目标日期转为对应时区的datetime对象:
from datetime import datetime import pytz # 构造带时区的目标日期(-05:00对应America/New_York时区) target_date = datetime.strptime('2013-01-07', '%Y-%m-%d').replace(tzinfo=pytz.timezone('America/New_York')) open_price = stock_df.loc[target_date, 'Open'] print(open_price)
4. 优化大型DataFrame查询速度
对于大型数据集,确保索引已排序,可大幅提升查询效率:
# 检查索引是否递增排序 print(stock_df.index.is_monotonic_increasing) # 若未排序,执行排序 if not stock_df.index.is_monotonic_increasing: stock_df = stock_df.sort_index()
内容的提问来源于stack exchange,提问作者hobbes
相关产品推荐
相关产品推荐

