【问题标题】:AttributeError: Can only use .dt accessor with datetimelike valuesAttributeError:只能将 .dt 访问器与 datetimelike 值一起使用
【发布时间】:2015-10-27 10:10:38
【问题描述】:

您好,我正在使用 pandas 将列转换为月份。 当我读取我的数据时,它们是对象:

Date           object
dtype: object

所以我首先将它们设为日期时间,然后尝试将它们设为月份:

import pandas as pd
file = '/pathtocsv.csv'
df = pd.read_csv(file, sep = ',', encoding='utf-8-sig', usecols= ['Date', 'ids'])    
df['Date'] = pd.to_datetime(df['Date'])
df['Month'] = df['Date'].dt.month

如果有帮助的话:

In [10]: df['Date'].dtype
Out[10]: dtype('O')

所以,我得到的错误是这样的:

/Library/Frameworks/Python.framework/Versions/2.7/bin/User/lib/python2.7/site-packages/pandas/core/series.pyc in _make_dt_accessor(self)
   2526             return maybe_to_datetimelike(self)
   2527         except Exception:
-> 2528             raise AttributeError("Can only use .dt accessor with datetimelike "
   2529                                  "values")
   2530 

AttributeError: Can only use .dt accessor with datetimelike values

编辑:

日期列是这样的:

0         2014-01-01         
1         2014-01-01         
2         2014-01-01         
3         2014-01-01         
4         2014-01-03       
5         2014-01-03         
6         2014-01-03         
7         2014-01-07         
8         2014-01-08         
9         2014-01-09 

你有什么想法吗? 非常感谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您的问题是 to_datetime 静默失败,因此 dtype 保持为 str/object,如果您设置参数 errors='coerce',那么如果任何特定字符串的转换失败,那么这些行将设置为 NaT

    df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
    

    因此,您需要找出这些特定行值有什么问题。

    docs

    【讨论】:

      【解决方案2】:

      首先你需要定义日期列的格式。

      df['Date'] = pd.to_datetime(df.Date, format='%Y-%m-%d %H:%M:%S')
      

      对于你的case base format可以设置为;

      df['Date'] = pd.to_datetime(df.Date, format='%Y-%m-%d')
      

      之后,您可以按如下方式设置/更改所需的输出;

      df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')
      

      【讨论】:

        【解决方案3】:

        #将日期转换成合适的格式,方便日期时间操作

        df_Time_Table["Date"] = pd.to_datetime(df_Time_Table["Date"])
        
        # Cal Year
        df_Time_Table['Year'] = df_Time_Table['Date'].dt.strftime('%Y')
        

        【讨论】:

          【解决方案4】:

          您的问题是“日期”的 dtype 保持为 str/object。使用read_csv时可以使用parse_dates参数

          import pandas as pd
          file = '/pathtocsv.csv'
          df = pd.read_csv(file, sep = ',', parse_dates= [col],encoding='utf-8-sig', usecols= ['Date', 'ids'],)    
          df['Month'] = df['Date'].dt.month
          

          来自the documentation for the parse_dates parameter

          parse_dates : bool 或 int 列表或名称或列表或 dict 列表,默认为 False

          行为如下:

          • 布尔值。如果为 True -> 尝试解析索引。
          • int 或名称列表。例如如果 [1, 2, 3] -> 尝试将第 1、2、3 列分别解析为单独的日期列。
          • 列表列表。例如如果 [[1, 3]] -> 合并第 1 列和第 3 列并解析为单个日期列。
          • 字典,例如{‘foo’ : [1, 3]} -> 将第 1、3 列解析为日期并调用结果‘foo’

          如果列或索引不能表示为日期时间数组,例如由于不可解析的值或时区的混合,列或索引将作为对象数据类型原样返回。对于非标准日期时间解析,在pd.read_csv 之后使用pd.to_datetime。要解析具有混合时区的索引或列,请将date_parser 指定为部分应用的pandas.to_datetime()utc=True。有关更多信息,请参阅使用混合时区解析 CSV。

          注意:iso8601 格式的日期存在快速路径。

          这个问题的相关案例是“int 或名称列表”之一。

          col 是 'Date' 的列索引,它被解析为单独的日期列。

          【讨论】:

            【解决方案5】:

            当你写作时

            df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
            df['Date'] = df['Date'].dt.strftime('%m/%d')
            

            可以修复

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-15
              • 1970-01-01
              • 1970-01-01
              • 2021-03-18
              • 2020-03-27
              相关资源
              最近更新 更多