提问人:Nasia Ntalla 提问时间:10/27/2015 最后编辑:FObersteinerNasia Ntalla 更新时间:4/1/2023 访问量:331178
AttributeError:只能使用具有类似 datetimelike 值的 .dt 访问器
AttributeError: Can only use .dt accessor with datetimelike values
问:
嗨,我正在使用 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
你有什么想法吗? 谢谢!
答:
您在这里的问题是静默失败,因此 dtype 保持为 ,如果您设置 param,那么如果任何特定字符串的转换失败,则这些行将设置为 。to_datetime
str/object
errors='coerce'
NaT
df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
因此,您需要找出这些特定行值的问题所在。
查看文档
评论
pd.to_datetime()
str/object
您在这里的问题是“Date”的 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
parse_dates : bool 或 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_datetime
pd.read_csv
date_parser
pandas.to_datetime()
utc=True
注意:iso8601 格式的日期存在快速路径。
这个问题的相关案例是“int 或名称列表”一个。
col 是“Date”的列索引,它解析为单独的日期列。
当你写的时候
df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
df['Date'] = df['Date'].dt.strftime('%m/%d')
它可以固定
首先,您需要定义日期列的格式。
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')
评论
, utc=True
将日期 #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')
train_data=pd.read_csv("train.csv",parse_dates=["date"])
我在尝试使用时遇到了类似的问题,尽管我中的所有元素都是实例(绝对没有 NA)。我怀疑这与具有不同时区的 tz 感知实例有关。pd.Series.dt.floor
pd.Series
datetime.datetime
为了利用该方法,我的解决方法是定义以下函数:pd.Timestamp.floor
def floor_datetime(base_datetime_aware, freq="2H"):
return pd.Timestamp(base_datetime_aware).floor(freq)
我只是用它来通过函数获取我的系列的每个元素。pd.Series.apply
最后,当你使用访问器时,你使用的函数是基类的方法,所以使用像我这样的简短自定义函数可能会解决你的问题!.dt
apply
评论
Date
pd.Series.apply
AttributeError
我的回答可能晚了,但这对我的数据有用。
将时间戳解析为 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=True
to_datetime
我的完整代码:
df["time"] = pd.to_datetime(df["_time"], errors='coerce',utc=False)
df['minute'] = df['time'].dt.minute
评论