我从财务API中提取了一些股票数据,并使用它创建了一个DataFrame。列为“日期”,“数据1”,“数据2”,“数据3”。然后,我将该DataFrame转换为CSV文件,并以“日期”列作为索引:
df.to_csv('data.csv', index_label='date')
在第二个脚本中,我读取了CSV并尝试在两个日期之间切片所得的DataFrame:
df = pd.read_csv('data.csv', parse_dates=['date'] ,index_col='date')
df = df['2020-03-28':'2020-04-28']
当我尝试执行此操作时,出现以下TypeError:
TypeError: cannot do slice indexing on <class 'pandas.core.indexes.numeric.Int64Index'> with these indexers [2020-03-28] of <class 'str'>
很明显,问题在于我正在尝试使用str切片日期时间对象。但这是令人困惑的部分!如果在第一步中,我将DataFrame保存到csv中,并且不要将'date'设置为索引:
df.to_csv('data.csv')
在第二个脚本中,我不再遇到TypeError:
df = pd.read_csv('data.csv', parse_dates=['date'] ,index_col='date')
df = df['2020-03-28':'2020-04-28']
现在可以正常工作了。唯一的问题是我要处理默认的Pandas索引列。
为什么当我在CSV中将“日期”列设置为索引时会出现TypeError ...但是当我在CSV中未设置任何索引时却没有出现TypeError吗?
答案 0 :(得分:2)
在您的 df 的“第一个”实例中,似乎 date 列是一个 普通列(不是索引),并且此DataFrame具有默认值 索引-连续的整数(其名称并不重要)。
在这种情况下,运行df.to_csv('data.csv', index_label='date')
导致输出文件包含:
date,date,data1,data2,data3
0,2020-03-27,10.5,12.3,13.2
1,2020-03-28,10.6,12.9,14.7
即:
然后,如果您阅读它正在运行
df = pd.read_csv('data.csv', parse_dates=['date'], index_col='date')
,然后:
现在,当您运行df['2020-03-28':'2020-04-28']
时,您尝试查找行
index 在给定的范围内。但是索引列是 Int64Index
类型(在您的安装中检查此类型),因此仅提及异常
被扔了。
当您运行df.to_csv('data.csv')
时,情况看起来会有所不同。
现在,该文件包含:
,date,data1,data2,data3
0,2020-03-27,10.5,12.3,13.2
1,2020-03-28,10.6,12.9,14.7
即:
现在,当您阅读它时,结果是:
现在,当您运行df['2020-03-28':'2020-04-28']
时,一切正常。
未来需要学习的东西:
运行df.to_csv('data.csv', index_label='date')
不会设置此项
列作为索引。它仅保存当前索引列
在给定名称下不做任何检查
只是同一个名字。
结果是2列可以具有相同的名称。