为什么当我试图切割我的Pandas DataFrame时,我得到这个TypeError?

问题描述 投票:0回答:1

我从一个金融API中提取了一些股票数据,并创建了一个DataFrame,其中包括 "日期","数据1","数据2","数据3"。我从金融API中提取了一些股票数据,并创建了一个DataFrame,列是 "date"、"data1"、"data2"、"data3"。 然后,我将DataFrame转换为以'date'列为索引的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?

python-3.x pandas dataframe typeerror slice
1个回答
2
投票

看来,在你的 "第一个 "实例中的 df, 日期 栏目是一个普通 列(不是索引),而这个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

即:

  • 导致输出文件包含: 指数 列(整数)给定 日期 名下index_label 参数。
  • 下一列,其中 df 被命名为 日期鉴于 日期 名字。

那么如果你读它运行df = pd.read_csv('data.csv', parse_dates=['date'], index_col='date')那么,

  • 第一 日期 列(整数)已被读作 日期 并将set作为索引。
  • 其二 日期 (日期)一栏改为: 日期.1 而它是一个 普通 列。

现在当你运行 df['2020-03-28':'2020-04-28'],您可以尝试寻找带有 指数 在给定的范围内。但索引列是 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 是索引)没有名字,而 价值。
  • 只是 列名 日期 是第二列,包含dates。

现在当你读取它时,结果是。

  • 日期 (换算成美元) DatetimeIndex)是 指数,
  • 原索引列更名为 未命名: 0毫不奇怪,因为在源文件中它没有名字。

而现在,当你运行 df['2020-03-28':'2020-04-28'] 一切都OK了。

未来要学习的东西:跑步 df.to_csv('data.csv', index_label='date') 不将此列设置为索引。它 只是 拯救了 当前 索引列下的名字。明目张胆 是否有其他列有相同的名称。

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

© www.soinside.com 2019 - 2024. All rights reserved.