Pandas 时间序列之 Timedelta

1. 前言

上一小节我们学习了时间序列的时期类型 Period ,表示具体的一个时间区间,以及我们上上一节学习的时间戳类型 Timestamp 表示具体的时间点,除了这两种常用的时间序列类型,今天我们将学习第三种时间序列类型 —— 时间长度(Timedelta)表示的是一段持续的时长,比如我们经常计时用到的 1 分钟,10 分钟等待,这种时间序列类型在我们生活中也是应用较为广泛的。

2. 时长 Timedelta

Timedelta 对象表示两个时间之间的时间差值,下面我们来看一下如何创建 Timedelta 对象,以及它常用的属性和方法。

2.1 Timedelta 的创建方法

Pandas 库中提供了特定的函数用于创建 Timedelta 对象。

pd.Timedelta(value, unit=None, **kwargs)
参数名 说明
value 要转换为时长的值,可以为字符串、数值等类型
unit 输入的单位,可以为 ns, us, ms, s, m, h, D ,默认是 ns

下面我们通过代码展示该函数的具体使用方式:

# 1.通过函数创建时间段
# 导入 pandas 数据包
import pandas as pd
pd.Timedelta(days=5, hours=12, minutes=50, seconds=20)
# --- 输出结果 ---
Timedelta('5 days 12:50:20')
# 结果解析:我们通过函数指定时间段,5天12小时50分20秒。

# 2.unit 参数,我们通过指定该参数的单位,可以看到时间段在该单位的值
pd.Timedelta(days=5, hours=12, minutes=50, seconds=20,unit='h')
# --- 输出结果 ---
Timedelta('5 days 12:00:00')
# 结果解析:这里可以看到我们指定单位为 ‘h’ ,在我们设置的 timedelta 中,输出的值到12小时。

除了通过函数,我们还可以通过两个时间戳相减得到一个时间段,如下代码所示:

# 导入 pandas 数据包
import pandas as pd
tt_01=pd.Timestamp("2020-12-23")
tt_02=pd.Timestamp("2020-12-20")
print(tt_01-tt_02)
print(type(tt_01-tt_02))
# --- 输出结果 ---
3 days 00:00:00
<class 'pandas._libs.tslibs.timedeltas.Timedelta'>
# 结果解析:这里我们定义了两个时间戳,通过时间戳相减我们看到输出的是3天,通过输出数据类型可以看到相减之后的数据类型是 Timedelta。

2.2 时段常用的属性和方法

Pandas 库中对于时间段 Timedelta ,提供了丰富的属性和方法,下面我就来列举一下该时间序列类型中常用的属性和方法。

1. daysseconds 属性

这两个属性分别返回时间段的天数和转换后的秒数。

# 导入 pandas 数据包
import pandas as pd
ss=pd.Timedelta("3 days 10:05:23")
ss.days
# --- 输出结果 ---
3

ss=pd.Timedelta("0 days 00:01:23")
ss.seconds
# --- 输出结果 ---
83  # 这里是1分23秒,所以合计是83秒

2. delta 属性

该属性可以获得时间段转换后的纳秒数。

# 导入 pandas 数据包
import pandas as pd
ss=pd.Timedelta("0 days 00:01:23")
ss.delta
# --- 输出结果 ---
83000000000

3. ceil() 函数

该函数通过指定固定的频率,可以返回一个新的时间段数据值。

# 导入 pandas 数据包
import pandas as pd
ss=pd.Timedelta("12 days 10:00:00")
ss.ceil("2D")
# --- 输出结果 ---
Timedelta('14 days 00:00:00') #通过指定2D的频率,看到新的时间段14days

4. isoformat() 函数

该函数将时间段转换成 ISO 8601 持续时间格式:P [n] Y [n] M [n] DT [n] H [n] M [n] S 。

# 导入 pandas 数据包
import pandas as pd
ss=pd.Timedelta("12 days 10:23:31")
ss.isoformat()
# --- 输出结果 ---
'P12DT10H23M31S'

5. total_seconds() 函数

该函数用于计算时间段总的持续时间,单位是秒。

# 导入 pandas 数据包
import pandas as pd
ss=pd.Timedelta("12 days 10:23:31")
ss.total_seconds()
# --- 输出结果 ---
1074211.0

2.3 时段索引

时段数据类型 Timedelta 的索引结构为 TimedeltaIndex ,我们可以通过 TimedeltaIndex () 或者 timedelta_range () 创建生成时间增量索引:

# 1、通过 TimedeltaIndex() 函数生成时间增量索引
# 通过 TimedeltaIndex() 函数定义了时间段索引
timedelta_index_res=pd.TimedeltaIndex(['1 days','1 days 12:04:23','02:00:00'])
# 将时间增量索引应用到 dataframe 数据结构中
value_dateDataFrame = [["a1","b1"],["a2","b2"],["a3","b3"]]
res = pd.DataFrame(value_dateDataFrame, index = timedelta_index_res)
print(res)
# --- 输出结果 ---
                  0   1
1 days 00:00:00  a1  b1
1 days 12:04:23  a2  b2
0 days 02:00:00  a3  b3
        
# 2、通过 timedelta_range() 函数生成时间增量索引,该函数有 start、end、periods、freq 四个参数,在生成时间增量索引时,至少要指定三个参数。
# 通过 timedelta_range() 函数定义了时间段索引
timedelta_index_res=pd.timedelta_range(start='00:00:00',end="14:00:00", freq='5H')
# 将时间增量索引应用到 dataframe 数据结构中
value_dateDataFrame = [["a1","b1"],["a2","b2"],["a3","b3"]]
res = pd.DataFrame(value_dateDataFrame, index = timedelta_index_res)
print(res)
# --- 输出结果 ---
                  0   1
0 days 00:00:00  a1  b1
0 days 05:00:00  a2  b2
0 days 10:00:00  a3  b3

3. 小结

本节课程我们主要学习了时间序列的 Timedelta 时间段数据类型,该数据类型表示具体的时间增量,是我们数据处理中常用的数据类型之一。本节课程的重点如下:

  • Timedelta 对象的创建方法;
  • Timedelta 对象中常用的属性和方法;
  • TimedeltaIndex 时间增量索引的创建方法。

图片描述