AttributeError:只能使用具有datetimelike值的.dt访问器

Nas*_*lla 23 python pandas

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

Date           object
dtype: object
Run Code Online (Sandbox Code Playgroud)

所以我首先让它们到达约会时间,然后尝试将它们作为月份:

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
Run Code Online (Sandbox Code Playgroud)

如果这有帮助:

In [10]: df['Date'].dtype
Out[10]: dtype('O')
Run Code Online (Sandbox Code Playgroud)

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

/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
Run Code Online (Sandbox Code Playgroud)

编辑:

日期列如下:

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 
Run Code Online (Sandbox Code Playgroud)

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

EdC*_*ica 49

这里你的问题是to_datetime无声失败所以dtype仍然是str/object,如果你设置param errors='coerce'然后如果任何特定字符串的转换失败,那么这些行设置为NaT.

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)

因此,您需要找出这些特定行值的错误.

查看文档


小智 9

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

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
Run Code Online (Sandbox Code Playgroud)

来自参数的文档parse_dates

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

行为如下:

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

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

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

这个问题的相关案例是“整数或名称列表”。

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


小智 6

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

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

对于您的案例库格式可以设置为;

df['Date'] = pd.to_datetime(df.Date, format='%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

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

df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)