熊猫的日期分类为dtype?

时间:2016-04-16 12:10:00

标签: pandas

我刚刚在文档中注意到您可以将日期转换为类别。我从来没有尝试过,直到星期一才有机会,但有人这样做吗?我不认为我已经充分利用了类别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

1 个答案:

答案 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)

尽管您的里程可能会有所不同。