Python与Pandas:将日期时间值系列转换为连续日期索引

1 投票
1 回答
3814 浏览
提问于 2025-04-18 09:16

我在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。目前我使用的方法是:

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

我首先从每个日期中减去最小的日期时间(a-a.min()),这样得到的是一个 timedelta64[ns] 类型的结果。接下来,我需要把这个结果转换成天数(timedelta64[D]),然后再转换成整数值。直接把 timedelta64[ns] 转换成 int 是不行的。

我在想有没有更好的方法来做到这一点。对于我当前这个包含超过80万行数据的序列,这个过程已经花了4秒钟,真是让人惊讶。


编辑

这个序列包含了几个月的日期时间。下面是一些示例数据,以及转换后的整数值,形成一个连续的天数序列。在这个例子中,2000-11-03 是最早的日期,所以它的索引是1。虽然 2000-11-05 这个日期没有出现(本来应该是索引3),但是 2000-11-06 仍然应该被赋值为 4,因为它是从 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 个回答

5

最近修复了一个性能问题,具体可以在这里查看。这个修复会在0.14.1版本中发布(这个版本很快就会出来,Windows的开发版本可以在这里找到,目前发布的版本稍微有点过时,没有包含这个修复,建议稍后再回来查看)。

顺便提一下,关于时间差转换的文档可以在这里找到。

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

撰写回答