Pandas整数和整数数组的加减操作已不再支持时间戳,应使用n * obj.freq
代替
在本文中,我们将会介绍Pandas所提供的整数和整数数组与时间戳加减操作的相关知识点,以及其最近不再支持这种加减操作的原因和如何应对。
阅读更多:Pandas 教程
Pandas整数和整数数组
在Pandas中,整数和整数数组是经常被使用的一种数据类型。在对整数和整数数组进行加减操作时,Pandas往往支持直接添加或减去一个整数n
。例如,我们有如下的Pandas数据,表示了10天的日期:
import pandas as pd
import numpy as np
dates = pd.Series(pd.date_range('2021-01-01', periods=10))
我们希望将这些日期向后移动2天,则可以直接使用如下的语句:
new_dates = dates + 2
这时候,new_dates
将会变成这样:
0 2021-01-03
1 2021-01-04
2 2021-01-05
3 2021-01-06
4 2021-01-07
5 2021-01-08
6 2021-01-09
7 2021-01-10
8 2021-01-11
9 2021-01-12
dtype: datetime64[ns]
这里,new_dates
中的每个日期都向后移动了2天。
Pandas时间戳
除了整数和整数数组,Pandas还提供了时间戳的数据类型。时间戳是指某个具体时刻的时间点,可以由Pandas的Timestamp
类来表示。我们可以这样来创建一个时间戳:
ts = pd.Timestamp('2021-01-01')
Pandas整数和整数数组,以及时间戳的加减操作
在早期的版本中,Pandas支持直接对整数和整数数组与时间戳进行加减操作。例如,代码如下:
dates + ts
这样的操作是将每个日期加上时间戳的时间差。例如,假设时间戳为ts = pd.Timestamp('2021-01-01 12:00:00')
,则加上ts
之后,new_dates
将会变成这个样子:
0 2021-01-01 12:00:00
1 2021-01-02 12:00:00
2 2021-01-03 12:00:00
3 2021-01-04 12:00:00
4 2021-01-05 12:00:00
5 2021-01-06 12:00:00
6 2021-01-07 12:00:00
7 2021-01-08 12:00:00
8 2021-01-09 12:00:00
9 2021-01-10 12:00:00
dtype: datetime64[ns]
然而,在最近的Pandas版本中,这种加减操作已经不再支持。如果我们按照旧的方式进行加减操作,则会得到一个DeprecationWarning
警告。实际运行过程中,可以发现这样的操作将会抛出异常错误,例如:
dates + ts
TypeError: Addition/subtraction of integers and integer-arrays with Timestamp is no longer supported. Instead of adding/subtracting
n
, usen * obj.freq
改进的加减操作
那么,Pandas要我们如何进行加减操作?Pandas现在推荐我们使用n * obj.freq
来替代原来的操作。obj.freq
表示时间戳的频率,例如obj.freq = 'D'
表示以天为单位进行时间戳加减操作。我们可以这样将上述的加减操作修改为新的方式:
new_dates = dates + 2 * pd.offsets.Day()
这里,pd.offsets.Day()
表示一个时间偏移量,也就是时间间隔为1天的时间差。将2乘以这个时间差,即可得到需要向后移动的总时间差。这个新的操作将会得到与原来相同的结果:
0 2021-01-03
1 2021-01-04
2 2021-01-05
3 2021-01-06
4 2021-01-07
5 2021-01-08
6 2021-01-09
7 2021-01-10
8 2021-01-11
9 2021-01-12
dtype: datetime64[ns]
在实际操作中,如果我们需要将时间戳向后或向前移动一个指定的时间间隔,那么按照新的方式应该这样来进行操作:
ts_new = ts + 2 * pd.offsets.Day()
这样,ts_new
将会是原来的时间戳加上2天的时间间隔:
Timestamp('2021-01-03 00:00:00')
总结
Pandas已经不再支持直接对整数和整数数组进行加减操作,同时也不再支持将时间戳与整数和整数数组进行加减操作。相反,Pandas要求我们使用新的方式,即通过乘以时间间隔的方式,来实现对整数和整数数组,以及时间戳的加减操作。这种方式无疑会更加灵活和方便,能够满足更多的数据处理需求。