Pandas 時(shí)間序列之 Timedelta
1. 前言
上一小節(jié)我們學(xué)習(xí)了時(shí)間序列的時(shí)期類型 Period ,表示具體的一個(gè)時(shí)間區(qū)間,以及我們上上一節(jié)學(xué)習(xí)的時(shí)間戳類型 Timestamp 表示具體的時(shí)間點(diǎn),除了這兩種常用的時(shí)間序列類型,今天我們將學(xué)習(xí)第三種時(shí)間序列類型 —— 時(shí)間長(zhǎng)度(Timedelta)表示的是一段持續(xù)的時(shí)長(zhǎng),比如我們經(jīng)常計(jì)時(shí)用到的 1 分鐘,10 分鐘等待,這種時(shí)間序列類型在我們生活中也是應(yīng)用較為廣泛的。
2. 時(shí)長(zhǎng) Timedelta
Timedelta 對(duì)象表示兩個(gè)時(shí)間之間的時(shí)間差值,下面我們來(lái)看一下如何創(chuàng)建 Timedelta 對(duì)象,以及它常用的屬性和方法。
2.1 Timedelta 的創(chuàng)建方法
Pandas 庫(kù)中提供了特定的函數(shù)用于創(chuàng)建 Timedelta 對(duì)象。
pd.Timedelta(value, unit=None, **kwargs)
參數(shù)名 | 說(shuō)明 |
---|---|
value | 要轉(zhuǎn)換為時(shí)長(zhǎng)的值,可以為字符串、數(shù)值等類型 |
unit | 輸入的單位,可以為 ns, us, ms, s, m, h, D ,默認(rèn)是 ns |
下面我們通過(guò)代碼展示該函數(shù)的具體使用方式:
# 1.通過(guò)函數(shù)創(chuàng)建時(shí)間段
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
pd.Timedelta(days=5, hours=12, minutes=50, seconds=20)
# --- 輸出結(jié)果 ---
Timedelta('5 days 12:50:20')
# 結(jié)果解析:我們通過(guò)函數(shù)指定時(shí)間段,5天12小時(shí)50分20秒。
# 2.unit 參數(shù),我們通過(guò)指定該參數(shù)的單位,可以看到時(shí)間段在該單位的值
pd.Timedelta(days=5, hours=12, minutes=50, seconds=20,unit='h')
# --- 輸出結(jié)果 ---
Timedelta('5 days 12:00:00')
# 結(jié)果解析:這里可以看到我們指定單位為 ‘h’ ,在我們?cè)O(shè)置的 timedelta 中,輸出的值到12小時(shí)。
除了通過(guò)函數(shù),我們還可以通過(guò)兩個(gè)時(shí)間戳相減得到一個(gè)時(shí)間段,如下代碼所示:
# 導(dǎo)入 pandas 數(shù)據(jù)包
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))
# --- 輸出結(jié)果 ---
3 days 00:00:00
<class 'pandas._libs.tslibs.timedeltas.Timedelta'>
# 結(jié)果解析:這里我們定義了兩個(gè)時(shí)間戳,通過(guò)時(shí)間戳相減我們看到輸出的是3天,通過(guò)輸出數(shù)據(jù)類型可以看到相減之后的數(shù)據(jù)類型是 Timedelta。
2.2 時(shí)段常用的屬性和方法
Pandas 庫(kù)中對(duì)于時(shí)間段 Timedelta ,提供了豐富的屬性和方法,下面我就來(lái)列舉一下該時(shí)間序列類型中常用的屬性和方法。
1. days 和 seconds 屬性
這兩個(gè)屬性分別返回時(shí)間段的天數(shù)和轉(zhuǎn)換后的秒數(shù)。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
ss=pd.Timedelta("3 days 10:05:23")
ss.days
# --- 輸出結(jié)果 ---
3
ss=pd.Timedelta("0 days 00:01:23")
ss.seconds
# --- 輸出結(jié)果 ---
83 # 這里是1分23秒,所以合計(jì)是83秒
2. delta 屬性
該屬性可以獲得時(shí)間段轉(zhuǎn)換后的納秒數(shù)。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
ss=pd.Timedelta("0 days 00:01:23")
ss.delta
# --- 輸出結(jié)果 ---
83000000000
3. ceil() 函數(shù)
該函數(shù)通過(guò)指定固定的頻率,可以返回一個(gè)新的時(shí)間段數(shù)據(jù)值。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
ss=pd.Timedelta("12 days 10:00:00")
ss.ceil("2D")
# --- 輸出結(jié)果 ---
Timedelta('14 days 00:00:00') #通過(guò)指定2D的頻率,看到新的時(shí)間段14days
4. isoformat() 函數(shù)
該函數(shù)將時(shí)間段轉(zhuǎn)換成 ISO 8601 持續(xù)時(shí)間格式:P [n] Y [n] M [n] DT [n] H [n] M [n] S 。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
ss=pd.Timedelta("12 days 10:23:31")
ss.isoformat()
# --- 輸出結(jié)果 ---
'P12DT10H23M31S'
5. total_seconds() 函數(shù)
該函數(shù)用于計(jì)算時(shí)間段總的持續(xù)時(shí)間,單位是秒。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
ss=pd.Timedelta("12 days 10:23:31")
ss.total_seconds()
# --- 輸出結(jié)果 ---
1074211.0
2.3 時(shí)段索引
時(shí)段數(shù)據(jù)類型 Timedelta 的索引結(jié)構(gòu)為 TimedeltaIndex ,我們可以通過(guò) TimedeltaIndex () 或者 timedelta_range () 創(chuàng)建生成時(shí)間增量索引:
# 1、通過(guò) TimedeltaIndex() 函數(shù)生成時(shí)間增量索引
# 通過(guò) TimedeltaIndex() 函數(shù)定義了時(shí)間段索引
timedelta_index_res=pd.TimedeltaIndex(['1 days','1 days 12:04:23','02:00:00'])
# 將時(shí)間增量索引應(yīng)用到 dataframe 數(shù)據(jù)結(jié)構(gòu)中
value_dateDataFrame = [["a1","b1"],["a2","b2"],["a3","b3"]]
res = pd.DataFrame(value_dateDataFrame, index = timedelta_index_res)
print(res)
# --- 輸出結(jié)果 ---
0 1
1 days 00:00:00 a1 b1
1 days 12:04:23 a2 b2
0 days 02:00:00 a3 b3
# 2、通過(guò) timedelta_range() 函數(shù)生成時(shí)間增量索引,該函數(shù)有 start、end、periods、freq 四個(gè)參數(shù),在生成時(shí)間增量索引時(shí),至少要指定三個(gè)參數(shù)。
# 通過(guò) timedelta_range() 函數(shù)定義了時(shí)間段索引
timedelta_index_res=pd.timedelta_range(start='00:00:00',end="14:00:00", freq='5H')
# 將時(shí)間增量索引應(yīng)用到 dataframe 數(shù)據(jù)結(jié)構(gòu)中
value_dateDataFrame = [["a1","b1"],["a2","b2"],["a3","b3"]]
res = pd.DataFrame(value_dateDataFrame, index = timedelta_index_res)
print(res)
# --- 輸出結(jié)果 ---
0 1
0 days 00:00:00 a1 b1
0 days 05:00:00 a2 b2
0 days 10:00:00 a3 b3
3. 小結(jié)
本節(jié)課程我們主要學(xué)習(xí)了時(shí)間序列的 Timedelta 時(shí)間段數(shù)據(jù)類型,該數(shù)據(jù)類型表示具體的時(shí)間增量,是我們數(shù)據(jù)處理中常用的數(shù)據(jù)類型之一。本節(jié)課程的重點(diǎn)如下:
- Timedelta 對(duì)象的創(chuàng)建方法;
- Timedelta 對(duì)象中常用的屬性和方法;
- TimedeltaIndex 時(shí)間增量索引的創(chuàng)建方法。