2017-05-15 36 views
0

我有一個帶時間戳列的dask數據框,我需要從中獲取星期幾和星期幾。轉換後的Dask`.dt`

這裏是DDF建設

dfs = [delayed(pd.read_csv)(path) for path in glob('../data/20*.zip')] 
df = dd.from_delayed(dfs) 

meta = ('starttime', pd.Timestamp) 
df['start'] = df.starttime.map_partitions(pd.to_datetime, meta=meta) 

現在,如果我使用類似 df.head(10).dt.year,它的工作原理(返回爲一年)。這意味着datacol被轉換。

但是,當我試圖讓一個新列,它提出了一個錯誤: df['dow'] = df['start'].dt.dayofweek(或任何其他「.DT」選項,對於這個問題):

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

缺少什麼我在這裏?

回答

2

我認爲你的meta是不完全正確的(它在最新的dask和pandas上引發了一個錯誤)。這是一個可重複使用的示例

In [41]: import numpy as np 

In [42]: import pandas as pd 

In [43]: import dask.dataframe as dd 

In [44]: df = pd.DataFrame({"A": pd.date_range("2017", periods=12)}) 

In [45]: df['B'] = df.A.astype(str) 

In [46]: ddf = dd.from_pandas(df, 2) 

In [47]: ddf['C'] = ddf.B.map_partitions(pd.to_datetime, meta=("B", "datetime64[ns]")) 

In [48]: ddf.C.dt.dayofweek 
Out[48]: 
Dask Series Structure: 
npartitions=2 
0  int64 
6  ... 
11  ... 
Name: C, dtype: int64 
Dask Name: dt-dayofweek, 12 tasks 

In [49]: ddf.C.dt.dayofweek.compute() 
Out[49]: 
0  6 
1  0 
2  1 
3  2 
4  3 
5  4 
6  5 
7  6 
8  0 
9  1 
10 2 
11 3 
Name: C, dtype: int64 

這是否適合您?如果沒有,你可以編輯你的問題,包括一個最小的例子?

+0

請注意,您也可以執行'ddf ['C'] = dd.to_datetime(ddf.B)'而不是使用'map_partitions'。 –