问题描述
聚宽中的DataFrame结构数据,index是日期,用itertuples遍历行时,如何取出每行的日期?
初次接触,python基础不足,网络查了资料也无法解决。在此,请教各位高手指点!谢谢!
df=get_price('000068.XSHE',count=20, frequency='daily', fields=('open', 'high', 'low', 'close','volume'),
end_date='2020-11-26',skip_paused=False, fq='pre',fill_paused=True,panel=False)
#获取列表形式,python标准的有dict构成的列表数据,包含有成交量信息
print(df)
for row in df.itertuples():
print(row)#这是迭代后每一个的数据形式
#问题:我想取出index中的日期,比如2020-10-30,以字符串形式打印,结果显示不出来
#结果是:< built-in method index of Pandas object at 0x7f8a205c4e80>
print(row.index)
print('-'*30,'一行遍历完','-'*30)
解决方案
你好!这个问题是因为在 Python 中,itertuples() 返回的是一个 namedtuple(命名元组)。
在 Python 的元组(tuple)对象中,自带了一个名为 index() 的内置方法(用于查找某个元素在元组中的位置)。当你写 row.index 时,Python 调用的是这个内置方法,而不是 DataFrame 的索引。
在 Pandas 的 itertuples() 中,为了避免与内置方法冲突,DataFrame 的索引(Index)被默认命名为大写的 Index。
解决方法
你需要使用大写的 row.Index 来获取日期。同时,因为获取到的是 Pandas 的 Timestamp 对象,你可以使用 .strftime('%Y-%m-%d') 将其转换为你想要的字符串格式。
修正后的代码示例
import pandas as pd
# 获取数据
df = get_price('000068.XSHE', count=20, frequency='daily',
fields=('open', 'high', 'low', 'close', 'volume'),
end_date='2020-11-26', skip_paused=False, fq='pre',
fill_paused=True, panel=False)
# 遍历 DataFrame
for row in df.itertuples():
# 使用大写的 Index 获取日期对象
date_obj = row.Index
# 将日期对象格式化为字符串
date_str = date_obj.strftime('%Y-%m-%d')
print("当前日期字符串:", date_str)
print("开盘价:", row.open)
print('-'*30, '一行遍历完', '-'*30)
补充:另一种遍历方法 iterrows()
除了 itertuples(),你也可以使用 iterrows(),它会直接将 index 和 row 数据分开返回,对于初学者可能更直观(尽管在处理极大数据量时 itertuples 性能更好):
for index, row in df.iterrows():
# 这里的 index 直接就是日期对象
date_str = index.strftime('%Y-%m-%d')
print("当前日期:", date_str)
print("收盘价:", row['close'])
总结:记住在 itertuples() 中,索引属性名是首字母大写的 Index 即可解决你的问题!