为什么在尝试对Pandas DataFrame进行切片时出现此TypeError?

时间:2020-06-02 13:48:49

标签: python-3.x pandas dataframe typeerror slice

我从财务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吗?

1 个答案:

答案 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

即:

  • 索引列(整数)的名称是 date ,由您在 index_label 参数,
  • df 中被命名为 date 的下一个列也也是 指定日期名称。

然后,如果您阅读它正在运行 df = pd.read_csv('data.csv', parse_dates=['date'], index_col='date'),然后:

  • 第一个 date 列(整数)已被读取为 date 和 设置为索引,
  • 第二个 date 列(日期)被读取为 date.1 和 这是普通列。

现在,当您运行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 中为索引)没有名称,并且 int 值,
  • 名为 date only 列是第二列,包含 日期。

现在,当您阅读它时,结果是:

  • 日期(已转换为 DatetimeIndex )是索引
  • 原始索引列的名称为 Unnamed:0 ,不足为奇, 因为在源文件中没有名称。

现在,当您运行df['2020-03-28':'2020-04-28']时,一切正常。

未来需要学习的东西: 运行df.to_csv('data.csv', index_label='date')不会设置此项 列作为索引。它保存当前索引列 在给定名称下不做任何检查 只是同一个名字。

结果是2列可以具有相同的名称。