pandas 属性错误:只能将. dt访问器与类似日期时间的值一起使用

pftdvrlh  于 2022-12-25  发布在  其他
关注(0)|答案(7)|浏览(146)

嗨,我正在使用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

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

cuxqih21

cuxqih211#

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

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

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

bjp0bcyl

bjp0bcyl2#

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

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')
rlcwz9us

rlcwz9us3#

此处的问题是"Date"的数据类型仍为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开始

    • 解析日期**:* bool或int列表或names列表或dict列表,默认为False *

其行为如下所示:

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

如果列或索引无法表示为日期时间数组(例如,由于不可分析的值或混合时区),则列或索引将作为对象数据类型返回,而不做任何更改。对于非标准日期时间分析,请在pd.read_csv之后使用pd.to_datetime。要分析混合时区的索引或列,请执行以下操作:将date_parser指定为部分应用的pandas.to_datetime()utc=True。有关详细信息,请参阅解析混合时区的CSV。
注意:iso8601格式的日期有一个快速路径。
这个问题的相关案例是"int或名称列表"。
col是"Date"的列索引,它解析为单独的日期列。

eblbsuwk

eblbsuwk4#

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

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

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

zrfyljdw6#

我在尝试使用pd.Series.dt.floor时遇到了类似的问题,尽管我的pd.Series中的所有元素都是datetime.datetime示例(绝对没有NA),我怀疑这与具有不同时区的tz感知示例有关。
为了利用pd.Timestamp.floor方法,我的解决方法是定义以下函数:

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

我只会使用pd.Series.apply通过函数获取Series的每个元素。
最后,当您使用.dt访问器时,您将使用的函数是基类的方法,因此使用apply和一个像我这样的简短自定义函数可能会解决您的问题!

fbcarpbf

fbcarpbf7#

当你写作的时候

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

可以修好的

相关问题