【问题标题】:Dask map_partitions fails when dataframe contains date field当数据框包含日期字段时,Dask map_partitions 失败
【发布时间】:2022-01-26 19:58:06
【问题描述】:

以下代码失败,表示字段date2 没有month 属性,因为date2 的类型是Series,而它的类型显然是日期。我错过了什么?

错误是AttributeError: 'Series' object has no attribute 'month'

import pandas as pd
import dask
import dask.dataframe as dd
import datetime

pdf = pd.DataFrame({
    'id2': [1, 1, 1, 2, 2],
    'balance': [150, 140, 130, 280, 260],
    'date2' : [datetime.datetime(2021,3,1), datetime.datetime(2021,4,1), 
               datetime.datetime(2021,5,1), datetime.datetime(2021,1,1), 
               datetime.datetime(2021,2,1)]
})

ddf = dd.from_pandas(pdf, npartitions=1) 

def func2(df):
    return df.date2.month

x = ddf.map_partitions(func2)  # <-- fails here

【问题讨论】:

  • 对dask不太熟悉,但如果它反映了pandas api - 那么它应该是df.date2.dt.month

标签: python pandas dask


【解决方案1】:

注意,dask 支持 pandas 的访问器,所以在这种情况下你根本不需要映射函数

x = ddf.date2.dt.month

(这也在评论中说明)

【讨论】:

    【解决方案2】:

    要访问datetime 函数,需要使用.dt accessor,所以在这种情况下的解决方法是:

    def func2(df):
        return df.date2.dt.month
    

    请注意,在这种情况下,该函数接受一个数据帧,但返回一个系列。这很好,但对于某些用例,可能有兴趣修改数据框并返回修改后的版本。在这种情况下,函数将如下所示:

    def func2(df):
        df['modified_column'] = df.date2.dt.month
        return df
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2012-11-09
      • 2017-02-08
      相关资源
      最近更新 更多