我有一个带有时间戳列的dask数据框,我需要从中获取一周中的一天。
这是ddf构造
test1 <- Map(full_join, first_list, second_list, MoreArgs=list(by = c("x" = "z")))
test2 <- Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list)
all.equal(test1, test2)
# [1] TRUE
现在,如果我使用类似的东西
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)
,它有效(返回一年)。这意味着转换了datacol。
但是,当我尝试获取新列时,会引发错误:
df.head(10).dt.year
(或任何其他&#34; .dt&#34;选项):
df['dow'] = df['start'].dt.dayofweek
我在这里缺少什么?
答案 0 :(得分: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
这对你有用吗?如果没有,你可以编辑你的问题以包含一个最小的例子吗?