我刚刚在文档中注意到您可以将日期转换为类别。我从来没有尝试过,直到星期一才有机会,但有人这样做吗?我不认为我已经充分利用了类别dtype,即使我处理的文件有大量重复数据。
如果我的文件在1个月内都有几十万条记录(因此日期重复),转换为类别然后执行.dt操作会更快吗?我知道我经常使用.dt.strftime()
它看起来像dtype是类别,但它仍然知道它是datetime64,这是否意味着timedeltas操作或偏移仍然有效?
In [129]: date_s = pd.Series(pd.date_range('1/1/2015', periods=5))
In [130]: date_cat = date_s.astype('category')
In [131]: date_cat
Out[131]:
0 2015-01-01
1 2015-01-02
2 2015-01-03
3 2015-01-04
4 2015-01-05
dtype: category
Categories (5, datetime64[ns]): [2015-01-01, 2015-01-02, 2015-01-03, 2015-01-04, 2015-01-05]
In [132]: date_cat.dt.day
Out[132]:
0 1
1 2
2 3
3 4
4 5
dtype: int64
答案 0 :(得分:0)
文档中特别提到了这一点,请参阅 String and datetime accessors。
只要类别是适当的类型,.dt
和 .str
访问器就适用于分类列。
就性能影响而言,文档提到
<块引用>如果您有 Series
类型,这对性能有一定影响
string
,其中重复了许多元素(即唯一
系列中的元素远小于
系列)。在这种情况下,可以更快地转换原始系列
到类型类别之一并使用 .str.<method>
或 .dt.<property>
例如
date_s = pd.Series(pd.date_range('1/1/2015', periods=5).repeat(10000))
date_s_cat = date_s.astype('category')
%timeit date_s.dt.day
%timeit date_s_cat.dt.day
10.4 ms ± 497 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.84 ms ± 793 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
尽管您的里程可能会有所不同。