属性错误:'tuple'对象没有 'lower' 属性。

4

我希望指定日期的格式,因为它是欧洲格式(否则,将其作为索引列后,日期将不会按顺序排列)。我按照以下教程操作:

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'

为什么我按照别人的代码却出现了错误?我已经完全复制了代码,这是怎么回事?谢谢。


为什么不使用参数来处理欧洲日期? pd.to_datetime(df['date'], dayfirst=True) - SamuelNLP
在我将日期指定为索引列之后,日期的顺序都被搞乱了。 - saga
你能发一份打印,展示一下你所说的“混乱”是什么意思吗? - SamuelNLP
DatetimeIndex(['2015-01-01 12:00:00','2015-01-01 13:00:00','2015-01-01 14:00:00','2015-01-01 15:00:00','2015-01-01 16:00:00','2015-01-01 17:00:00','2015-01-01 18:00:00','2015-01-31 19:00:00','2015-01-31 20:00:00','2015-01-31 21:00:00',... '2017-01-12 11:00:00']。如您所见,日期从2015-01-01 18:00跳到了2015-01-31 19:00。但是数据集中有欧洲格式的2015-01-01 19:00。 - saga
请查看我的更新答案。 - SamuelNLP
3个回答

4

您的列名中有双括号。

为什么不让Pandas来帮助您呢?例如:

编辑:由于您不想考虑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)

EDIT 2: 这行代码的解释 [x[:-9] for x in df['date'].squeeze().tolist()]

df['date'].squeeze() -> 将dataframe列压缩为series

df['date'].squeeze().tolist() -> 转换为列表

[x[:-9] for x in df['date'].squeeze().tolist()] -> 对于列表中的每个日期,仅保留从末尾开始计算的第9个元素之前的元素,即删除GMT部分

根据您提供的子集数据,我得到了这个结果。Pandas足够聪明,能够理解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

使用我提供的代码,它可以正确获取日期。 - SamuelNLP
即使我使用你的代码,我仍然会遇到AttributeError: 'tuple' object has no attribute 'lower'错误,这与我最初遇到的问题相同。 - saga
我不太理解你新编辑的那一行代码具体是做什么的,但它确实以某种方式解决了问题,谢谢。顺便说一句,根据我所遵循的教程,他也使用了双括号,而且对他来说起作用了。但是对我来说却不行,我感到非常困惑... - saga
我已经添加了一个解释。 - SamuelNLP
我遇到了同样的错误,但是出现在一个包含字符串“20180101”的字段上。我能够使用你的解决方案来使用to_datetime,但我仍然不知道最初导致问题的原因。 - Giacomo
显示剩余5条评论

0

只需要这样做:

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接