【问题标题】:How to speed up DatetimeIndex processing?如何加快 DatetimeIndex 处理?
【发布时间】:2015-12-31 01:40:37
【问题描述】:

我有一个大熊猫 DataFrame(大约 1050000 个条目)。其中一列的类型为datetime。我想提取年、月和工作日。问题是下面显示的代码非常慢:

df['Year'] = pd.DatetimeIndex(df.Date).year
df['Month'] = pd.DatetimeIndex(df.Date).month
df['Weekday'] = pd.DatetimeIndex(df.Date).weekday

更新:

数据如下:

      Id  DayOfWeek       Date
0      1          5 2015-07-31   
1      2          4 2015-07-30   
2      3          3 2015-07-29   
3      4          2 2015-07-28  
4      5          1 2015-07-27 

如果我这样做:

df = pd.read_csv("data.csv", parse_dates=[2])

df['Year'] = pd.to_datetime(df['Date']).year
df['Month'] = pd.to_datetime(df['Date']).month
df['Weekday'] = pd.to_datetime(df['Date']).weekday

那么错误是:

AttributeError: 'Series' object has no attribute 'year'

【问题讨论】:

    标签: python pandas datetime dataframe datetimeindex


    【解决方案1】:

    您声明您的列已经是 datetime64 类型。在这种情况下,您可以简单地使用.dt accessor 来公开与列中的日期时间值关联的方法和属性:

    df['Year'] = df.Date.dt.year
    

    这将比编写 pd.DatetimeIndex(df.Date).year 先创建一个全新的索引对象快得多。

    【讨论】:

    • 它说 AttributeError: Can only use .dt accessor with datetimelike values
    • 啊 - 那么您毕竟没有包含 datetime64 dtype 的列。您需要转换列;您可以按照 qmorgan 的回答中的建议使用df['Date'] = pd.to_datetime(df['Date'])
    • 然后它说 ValueError: New date column already in dict Date... 我正在以这种方式读取 csv:df = pd.read_csv("data.csv", dtype=dtypestrain),其中 dtypestrain = { 'Id': int, 'DayOfWeek': int, 'Date': dt.datetime}
    • 还有 AttributeError: 'module' object has no attribute 'parsedDate'
    • read_csv 推断列数据类型要容易得多。尝试使用pd.read_csv("data.csv", parse_dates=[2]) 让函数在读取数据时解析日期时间值。
    【解决方案2】:

    您似乎每次都在解析日期,而不是一次全部解析。另外,使用to_datetime() 方法可能会更快。

    试试

    df['parsedDate'] = pd.to_datetime(df['Date'])
    df['Year'] = pd.parsedDate.year
    df['Month'] = pd.parsedDate.month
    df['Weekday'] = pd.parsedDate.weekday
    

    【讨论】:

    • 它说 ValueError: New date column already in dict Date... 我正在以这种方式读取 csv:df = pd.read_csv("data.csv", dtype=dtypestrain),其中 dtypestrain = { 'Id':int,'DayOfWeek':int,'Date':dt.datetime}
    • 或 AttributeError: 'module' 对象没有属性 'parsedDate'
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多