python KeyError:'日期时间'

Posted

技术标签:

【中文标题】python KeyError:\'日期时间\'【英文标题】:python KeyError: 'date-time'python KeyError:'日期时间' 【发布时间】:2020-01-06 07:36:57 【问题描述】:

我有一个数据框 pd1 和 pandas

pd1 = pd.read_csv(r'c:\am\wiki_stats\topandas.txt',sep=':',
                  header=None, names  = ['date-time','domain','requests-qty','response-bytes'],
                   parse_dates=[1], converters='date-time': to_datetime, index_col = 'date-time')

带索引

>> pd1.index:  

 DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 00:00:00',
                '2016-01-01 00:00:00', '2016-01-01 00:00:00',
                '2016-01-01 00:00:00', '2016-01-01 00:00:00',
                '2016-01-01 00:00:00', '2016-01-01 00:00:00',
                '2016-01-01 00:00:00', '2016-01-01 00:00:00',
                ...
                '2016-08-05 12:00:00', '2016-08-05 12:00:00',
                '2016-08-05 12:00:00', '2016-08-05 12:00:00',
                '2016-08-05 12:00:00', '2016-08-05 12:00:00',
                '2016-08-05 12:00:00', '2016-08-05 12:00:00',
                '2016-08-05 12:00:00', '2016-08-05 12:00:00'],
               dtype='datetime64[ns]', name='date-time', length=6084158, freq=None)

但是当我想为该列设置索引时,我收到如下错误(我最初想设置多列索引,出现了该错误,然后尝试从中创建其他数据框 pd_new_index = pd1.set_index(['requests-qty','domain']) 以其他列作为索引(好的)并使新框架也将索引设置为“日期时间”列返回pd_new_2 = pd_new_index.set_index(['date-time']) - 同样的错误)。 'date-time' 看起来不像特殊关键字,而且该列现在是索引。为什么会出错?

KeyError Traceback(最近调用 最后的) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py 在 get_loc(self, key, method, tolerance) 2656 中尝试: -> 2657 return self._engine.get_loc(key) 2658 除了 KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi 在 pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi 在 pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '日期时间'

在处理上述异常的过程中,又发生了一个异常:

KeyError Traceback(最近调用 最后)在 ----> 1 pd_new_2 = pd_new_index.set_index(['date-time'])

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py 在 set_index(自我,键,删除,追加,就地,验证完整性)4176 names.append(None) 4177 其他: -> 4178 level = frame[col]._values 4179 names.append(col) 4180 if drop:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py 在 getitem(self, key) 2925 if self.columns.nlevels > 1: 2926 return self._getitem_multilevel(key) -> 2927 indexer = self.columns.get_loc(key) 2928 if is_integer(indexer): 2929 indexer = [indexer]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py 在 get_loc(self、key、method、tolerance) 2657 返回 self._engine.get_loc(key) 2658 除了 KeyError: -> 2659 返回 self._engine.get_loc(self._maybe_cast_indexer(key)) 2660 indexer = self.get_indexer([key],method=method,tolerance=tolerance) 2661 如果 indexer.ndim > 1 或 indexer.size > 1:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi 在 pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi 在 pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '日期时间'

【问题讨论】:

【参考方案1】:

原因是date-time 已经是索引,这里是DatetimeIndex,所以不可能像按名称列一样选择它。

原因是参数index_col:

pd1 = pd.read_csv(r'c:\am\wiki_stats\topandas.txt',
                  sep=':',
                  header=None, 
                  names  = ['date-time','domain','requests-qty','response-bytes'],
                  parse_dates=[1], 
                  converters='date-time': to_datetime, 
                  index_col = 'date-time')

对于MultiIndex,在index_col 中添加列名列表,删除converters 并在parse_dates 参数中指定列名:

import pandas as pd
from io import StringIO

temp=u"""2016-01-01:d1:0:0
2016-01-02:d2:0:1
2016-01-03:d3:1:0"""
#after testing replace 'pd.compat.StringIO(temp)' to r'c:\am\wiki_stats\topandas.txt''
df = pd.read_csv(StringIO(temp), 
                 sep=':',
                 header=None, 
                 names  = ['date-time','domain','requests-qty','response-bytes'],
                 parse_dates=['date-time'], 
                 index_col = ['date-time','domain'])

print (df)

date-time  domain                              
2016-01-01 d1                 0               0
2016-01-02 d2                 0               1
2016-01-03 d3                 1               0

print (df.index)
MultiIndex([('2016-01-01', 'd1'),
            ('2016-01-02', 'd2'),
            ('2016-01-03', 'd3')],
           names=['date-time', 'domain'])

EDIT1:在set_index 中使用append 参数的解决方案:

import pandas as pd
from io import StringIO


temp=u"""2016-01-01:d1:0:0
2016-01-02:d2:0:1
2016-01-03:d3:1:0"""
#after testing replace 'pd.compat.StringIO(temp)' to r'c:\am\wiki_stats\topandas.txt''
df = pd.read_csv(StringIO(temp), 
                 sep=':',
                 header=None, 
                 names  = ['date-time','domain','requests-qty','response-bytes'],
                 parse_dates=['date-time'], 
                 index_col = 'date-time')

print (df)
           domain  requests-qty  response-bytes
date-time                                      
2016-01-01     d1             0               0
2016-01-02     d2             0               1
2016-01-03     d3             1               0

print (df.index)
DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03'], 
              dtype='datetime64[ns]', name='date-time', freq=None)

df1 = df.set_index(['domain'], append = True)
print (df1)
                   requests-qty  response-bytes
date-time  domain                              
2016-01-01 d1                 0               0
2016-01-02 d2                 0               1
2016-01-03 d3                 1               0

print (df1.index)
MultiIndex([('2016-01-01', 'd1'),
            ('2016-01-02', 'd2'),
            ('2016-01-03', 'd3')],
           names=['date-time', 'domain'])

【讨论】:

如何将其他列添加到索引以使索引类似于pd1.set_index(['date-time','domain']) 我知道我可以追加,不是吗? pd_new_index4 = pd1.set_index(['domain'], append = True) 在该命令之后我运行 pd_new_index_v4.head(5) 它在其他列名下方显示两个第一列名称 - 就像之前的第一个一样。但是print (pd_new_index_v4.index) 什么也没给出,在其他一些点击之后我有insufficient memory to display page jupyter 中的一些错误。这是我认为的另一个问题。但是追加应该可以吗? @AlexeiMartianov - 我认为 pd_new_index4 = pd1.set_index(['domain'], append = True) 是一个很好的解决方案,什么回报 print (pd_new_index_v4.index) ?没什么?很奇怪 我猜这是内存不足的问题,我的数据集可能被认为很大(200Mb 文本文件)。或者它没有那么大?我怎么知道 Jupyter 只是落后了? @AlexeiMartianov - 当然,它是调用multi line string,而u 是用于python 2 的unicode,现在应该删除它,因为python 3 支持unicode

以上是关于python KeyError:'日期时间'的主要内容,如果未能解决你的问题,请参考以下文章

python KeyError:'日期时间'

使用日期时间绘制切片熊猫数据框时出现 KeyError

使用 DictReader 访问 CSV 的第三列时出现 KeyError [重复]

熊猫数据框索引 datetime.date 转换为对象 KeyError

熊猫散点图日期时间

使用 .loc() 时的 Pandas KeyError [重复]