AttributeError:'元组'对象没有属性' lower'

时间:2017-12-07 15:44:49

标签: python pandas datetime

我想指定日期的格式,因为它是欧洲格式的(或者在我将其作为索引列后,日期不会按顺序排列)。我完全按照以下教程完成了: enter image description here

但是在我执行

之后
df.date=pd.to_datetime(df.date,format='%d.%m.%Y %H:%M:%S.%f')

我收到此错误

df = pd.read_csv("F:\Python\Jupyter notes\AUDCAD1h.csv")
df.columns = [['date', 'open','high','low','close','volume']]

df.head()
Out[66]: 
                               date     open     high      low    close volume
0  01.01.2015 00:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821    0.0
1  01.01.2015 01:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821    0.0
2  01.01.2015 02:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821    0.0
3  01.01.2015 03:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821    0.0
4  01.01.2015 04:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821    0.0

df.Date=pd.to_datetime(df.date,format='%d.%m.%Y %H:%M:%S.%f')
Traceback (most recent call last):

  File "<ipython-input-67-29b50fd32986>", line 1, in <module>
    df.Date=pd.to_datetime(df.date,format='%d.%m.%Y %H:%M:%S.%f')

  File "C:\Users\AM\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 376, in to_datetime
    result = _assemble_from_unit_mappings(arg, errors=errors)

  File "C:\Users\AM\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 446, in _assemble_from_unit_mappings
    unit = {k: f(k) for k in arg.keys()}

  File "C:\Users\AM\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 446, in <dictcomp>
    unit = {k: f(k) for k in arg.keys()}

  File "C:\Users\AM\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 441, in f
    if value.lower() in _unit_map:

AttributeError: 'tuple' object has no attribute 'lower'

为什么我得到错误,但我跟着的那个没错?我完全复制了代码。它有什么问题?感谢。

3 个答案:

答案 0 :(得分:3)

列名中有双括号。

为什么不让大熊猫为你工作呢?例如,

编辑:因为你不想考虑GMT部分,所以我用列表理解删除了它

import pandas as pd

df = pd.read_csv("date_t.csv")

print(df)
df.columns = ['date', 'open','high','low','close','volume']

df['date'] = pd.to_datetime([x[:-9] for x in df['date'].squeeze().tolist()], dayfirst=True)

df.set_index('date', inplace=True)

print(df)

编辑2:对该行的解释     [x[:-9] for x in df['date'].squeeze().tolist()]

  

df['date'].squeeze() - &gt;挤压系列中的dataframe列

     

df['date'].squeeze().tolist() - &gt;转入列表

     

[x[:-9] for x in df['date'].squeeze().tolist()] - &gt;对于列表中的每个日期,只保留元素,直到从结尾开始计算第9个,这意味着删除GMT部分

从您的子集数据中,这就是我得到的。熊猫非常聪明,可以理解GMT-0500并将考虑到这一点的日期转换成日期。

                              1        2        3        4        5      6
0  01.01.2015 00:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821  0
1  01.01.2015 01:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821  0
2  01.01.2015 02:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821  0
3  01.01.2015 03:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821  0
4  01.01.2015 04:00:00.000 GMT-0500  0.94821  0.94821  0.94821  0.94821  0
                        open     high      low    close  volume
date                                                           
2015-01-01 00:00:00  0.94821  0.94821  0.94821  0.94821     0.0
2015-01-01 01:00:00  0.94821  0.94821  0.94821  0.94821     0.0
2015-01-01 02:00:00  0.94821  0.94821  0.94821  0.94821     0.0
2015-01-01 03:00:00  0.94821  0.94821  0.94821  0.94821     0.0
2015-01-01 04:00:00  0.94821  0.94821  0.94821  0.94821     0.0

答案 1 :(得分:0)

我也在复制这个算法并且遇到了同样的错误,直到我意识到这是我下载数​​据的方式的问题。从Dukasopy下载而不是本地时选择GMT然后您可以使用他的原始代码

答案 2 :(得分:0)

只需执行以下操作:

df = pd.read_csv('GBPUSD.csv',index_col = 0,parse_dates = True)