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

AttributeError: Can only use .dt accessor with datetimelike values

提问人:Nasia Ntalla 提问时间:10/27/2015 最后编辑:FObersteinerNasia Ntalla 更新时间:4/1/2023 访问量:331178

问:

嗨,我正在使用 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 熊猫 日期时间

评论


答:

165赞 EdChum 10/27/2015 #1

您在这里的问题是静默失败,因此 dtype 保持为 ,如果您设置 param,那么如果任何特定字符串的转换失败,则这些行将设置为 。to_datetimestr/objecterrors='coerce'NaT

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

因此,您需要找出这些特定行值的问题所在。

查看文档

评论

1赞 ha-pu 8/23/2023
当我将输出存储在格式为 .当我将输出存储在新列中时,它工作正常。pd.to_datetime()str/object
9赞 Danny Wu 11/30/2018 #2

您在这里的问题是“Date”的 dtype 仍为 str/object。您可以在使用时使用该参数parse_datesread_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

parse_dates 参数的文档

parse_datesbool 或 list of int 或 names 或 list of lists or dict,默认为 False

行为如下:

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

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

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

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

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

-1赞 Ömer Yıldız 6/28/2020 #3

当你写的时候

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

它可以固定

34赞 Yiğit Can Taşoğlu 9/28/2020 #4

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

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

对于您的案例,基本格式可以设置为;

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

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

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

评论

0赞 Purushottam 5/20/2022
它工作正常
0赞 AJ AJ 8/23/2022
如果您有多个时区,请使用 将 ALL 转换为 UTC。否则,你会得到:pandas Tz-aware datetime.datetime cannot be converted to datetime64 unless utc=True, utc=True
4赞 Prashant Mallick 9/10/2021 #5

将日期 #Convert 为正确的格式,以便可以轻松执行日期时间操作

df_Time_Table["Date"] = pd.to_datetime(df_Time_Table["Date"])

# Cal Year
df_Time_Table['Year'] = df_Time_Table['Date'].dt.strftime('%Y')
3赞 MD Gazuruddin 9/12/2022 #6

train_data=pd.read_csv("train.csv",parse_dates=["date"])

0赞 pmahuzieru 12/21/2022 #7

我在尝试使用时遇到了类似的问题,尽管我中的所有元素都是实例(绝对没有 NA)。我怀疑这与具有不同时区的 tz 感知实例有关。pd.Series.dt.floorpd.Seriesdatetime.datetime

为了利用该方法,我的解决方法是定义以下函数:pd.Timestamp.floor

def floor_datetime(base_datetime_aware, freq="2H"):
    return pd.Timestamp(base_datetime_aware).floor(freq)

我只是用它来通过函数获取我的系列的每个元素。pd.Series.apply

最后,当你使用访问器时,你使用的函数是基类的方法,所以使用像我这样的简短自定义函数可能会解决你的问题!.dtapply

评论

0赞 Vijay Varadan 12/24/2022
将 floor() 应用于 OP 的列(在转换为日期时间之前为 str 类型)如何解决问题?如果您建议的解决方案是使用 ,它并不比已经接受的答案或这个提供列中数据格式的答案更好。Datepd.Series.apply
0赞 pmahuzieru 12/26/2022
我来到这里是因为我得到了标题中提到的。我写的东西对我的问题有用,我想发布它,以防有人用类似的东西到达这篇文章。如果它再次成为 SO 指南,我很想知道。AttributeError
4赞 myroman 4/1/2023 #8

我的回答可能晚了,但这对我的数据有用。

将时间戳解析为 datetime 对象没有任何错误,但是在尝试提取分钟组件时仍然出错。 事实证明(经过长时间的二进制搜索),我的数据具有混合时区偏移量,如下所示:AttributeError: Can only use .dt accessor with datetimelike values

_time
2023-03-28T15:52:00.000-07:00
2023-02-08T11:16:13.000-08:00

因此,我向函数添加了参数,以将我的时区感知时间戳字符串转换为UTC时间戳。只有在这个练习之后,错误才消失了。utc=Trueto_datetime

我的完整代码:

df["time"] = pd.to_datetime(df["_time"], errors='coerce',utc=False)
df['minute'] = df['time'].dt.minute

评论

0赞 jaybrau 5/26/2023
您的评论建议使用 utc=True,但示例有 utc=False。
0赞 nbeuchat 8/21/2023
这确实解决了问题。现在的问题是,您实际上可能对时区和当地时间感兴趣:-/