Python&熊猫:将一系列日期时间值转换为连续的日间指数

时间:2014-06-10 10:11:00

标签: python datetime pandas days

我在pandas中有一个系列a

>>> type(a)
<class 'pandas.core.series.Series'>

datetime64[ns]值组成:

>>> print a
0   2000-11-01
...
10   2000-11-04
11   2000-11-05
...
Name: date, dtype: datetime64[ns]

我想将此转换为描述日期的整数系列,而第一个值( 2000-11-01 )应该具有索引1.目前我正在使用:< / p>

b = (a-a.min()).astype('timedelta64[D]').astype(int)+1

所以我首先减去最小的datetime64(a-a.min()),得到一个timedelta64[ns],我首先需要转换为几天(timedelta64[D])然后转换为整数值。无法从timedelta64[ns]直接转换为int

我想知道是否有更好的方法。 对于我当前包含超过800k行的Series-object,这需要4secs Oo


修改

该系列包含几个月的日期时间。将结果整数值作为连续日系列的示例数据。在这种情况下, 2000-11-03 是最早的日期,因此如上所述获得索引1。日期时间 2000-11-05 不存在(本来是索引3),但 2000-11-06 仍应分配 4 asit是从 2000-11-03开始的第四天

2000-01-03 -> 1
2000-01-04 -> 2
2000-01-06 -> 4
...
2000-01-31 -> 29
2000-02-01 -> 30
2000-02-02 -> 31
2000-02-04 -> 33
...

1 个答案:

答案 0 :(得分:5)

性能问题最近已修复here。这将是0.14.1(即将发布,Windows的发布二进制文件发布here,当前发布的内容略有过时,不包括此修复程序,请稍后再回来查看。)

FYI timedelta转换的文档为here

In [1]: s = Series(pd.date_range('20000101',periods=10000).tolist() * 80)

0.14.0

In [3]: %timeit (s-s.min()).astype('timedelta64[D]').astype(int)+1
1 loops, best of 3: 2.9 s per loop

0.14.1

In [12]: %timeit (s-s.min()).astype('timedelta64[D]').astype(int)+1
10 loops, best of 3: 24.7 ms per loop