溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解Pandas時(shí)間序列

發(fā)布時(shí)間:2021-11-02 16:01:31 來(lái)源:億速云 閱讀:149 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“怎么理解Pandas時(shí)間序列”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么理解Pandas時(shí)間序列”吧!

依托 NumPy 的 datetime64、timedelta64 等數(shù)據(jù)類型,pandas 可以處理各種時(shí)間序列數(shù)據(jù),還能調(diào)用 scikits.timeseries 等 Python 支持庫(kù)的時(shí)間序列功能。

Pandas 支持以下操作:

解析時(shí)間格式字符串、np.datetime64、datetime.datetime 等多種時(shí)間序列數(shù)據(jù)。

In [1]: import datetime

In [2]: dti = pd.to_datetime(['1/1/2018', np.datetime64('2018-01-01'),
   ...:                       datetime.datetime(2018, 1, 1)])
   ...: 

In [3]: dti
Out[3]: DatetimeIndex(['2018-01-01', '2018-01-01', '2018-01-01'], dtype='datetime64[ns]', freq=None)

生成 DatetimeIndex、TimedeltaIndex、PeriodIndex 等定頻日期與時(shí)間段序列。

In [4]: dti = pd.date_range('2018-01-01', periods=3, freq='H')

In [5]: dti
Out[5]: 
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
               '2018-01-01 02:00:00'],
              dtype='datetime64[ns]', freq='H')

處理、轉(zhuǎn)換帶時(shí)區(qū)的日期時(shí)間數(shù)據(jù)。

In [6]: dti = dti.tz_localize('UTC')

In [7]: dti
Out[7]: 
DatetimeIndex(['2018-01-01 00:00:00+00:00', '2018-01-01 01:00:00+00:00',
               '2018-01-01 02:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq='H')

In [8]: dti.tz_convert('US/Pacific')
Out[8]: 
DatetimeIndex(['2017-12-31 16:00:00-08:00', '2017-12-31 17:00:00-08:00',
               '2017-12-31 18:00:00-08:00'],
              dtype='datetime64[ns, US/Pacific]', freq='H')

按指定頻率重采樣,并轉(zhuǎn)換為時(shí)間序列。

In [9]: idx = pd.date_range('2018-01-01', periods=5, freq='H')

In [10]: ts = pd.Series(range(len(idx)), index=idx)

In [11]: ts
Out[11]: 
2018-01-01 00:00:00    0
2018-01-01 01:00:00    1
2018-01-01 02:00:00    2
2018-01-01 03:00:00    3
2018-01-01 04:00:00    4
Freq: H, dtype: int64

In [12]: ts.resample('2H').mean()
Out[12]: 
2018-01-01 00:00:00    0.5
2018-01-01 02:00:00    2.5
2018-01-01 04:00:00    4.0
Freq: 2H, dtype: float64

用絕對(duì)或相對(duì)時(shí)間差計(jì)算日期與時(shí)間。

In [13]: friday = pd.Timestamp('2018-01-05')

In [14]: friday.day_name()
Out[14]: 'Friday'

# 添加 1 個(gè)日歷日
In [15]: saturday = friday + pd.Timedelta('1 day')

In [16]: saturday.day_name()
Out[16]: 'Saturday'

# 添加 1 個(gè)工作日,從星期五跳到星期一
In [17]: monday = friday + pd.offsets.BDay()

In [18]: monday.day_name()
Out[18]: 'Monday'

Pandas 提供了一組精悍、實(shí)用的工具集以完成上述操作。

時(shí)間序列縱覽

Pandas 支持 4 種常見(jiàn)時(shí)間概念:

  1. 日期時(shí)間(Datetime):帶時(shí)區(qū)的日期時(shí)間,類似于標(biāo)準(zhǔn)庫(kù)的datetime.datetime 。

  2. 時(shí)間差(Timedelta):絕對(duì)時(shí)間周期,類似于標(biāo)準(zhǔn)庫(kù)的datetime.timedelta。

  3. 時(shí)間段(Timespan):在某一時(shí)點(diǎn)以指定頻率定義的時(shí)間跨度。

  4. 日期偏移(Dateoffset):與日歷運(yùn)算對(duì)應(yīng)的時(shí)間段,類似 dateutil 的dateutil.relativedelta.relativedelta。

怎么理解Pandas時(shí)間序列

一般情況下,時(shí)間序列主要是 Series 或 DataFrame 的時(shí)間型索引,可以用時(shí)間元素進(jìn)行操控。

In [19]: pd.Series(range(3), index=pd.date_range('2000', freq='D', periods=3))
Out[19]: 
2000-01-01    0
2000-01-02    1
2000-01-03    2
Freq: D, dtype: int64

當(dāng)然,Series 與 DataFrame 也可以直接把時(shí)間序列當(dāng)成數(shù)據(jù)。

In [20]: pd.Series(pd.date_range('2000', freq='D', periods=3))
Out[20]: 
0   2000-01-01
1   2000-01-02
2   2000-01-03
dtype: datetime64[ns]

Series 與 DataFrame 提供了 datetime、timedelta 、Period 擴(kuò)展類型與專有用法,不過(guò),Dateoffset 則保存為 object。

In [21]: pd.Series(pd.period_range('1/1/2011', freq='M', periods=3))
Out[21]: 
0    2011-01
1    2011-02
2    2011-03
dtype: period[M]

In [22]: pd.Series([pd.DateOffset(1), pd.DateOffset(2)])
Out[22]: 
0         <DateOffset>
1    <2 * DateOffsets>
dtype: object

In [23]: pd.Series(pd.date_range('1/1/2011', freq='M', periods=3))
Out[23]: 
0   2011-01-31
1   2011-02-28
2   2011-03-31
dtype: datetime64[ns]

Pandas 用 NaT 表示日期時(shí)間、時(shí)間差及時(shí)間段的空值,代表了缺失日期或空日期的值,類似于浮點(diǎn)數(shù)的 np.nan。

In [24]: pd.Timestamp(pd.NaT)
Out[24]: NaT

In [25]: pd.Timedelta(pd.NaT)
Out[25]: NaT

In [26]: pd.Period(pd.NaT)
Out[26]: NaT

# 與 np.nan 一樣,pd.NaT 不等于 pd.NaT 
In [27]: pd.NaT == pd.NaT
Out[27]: False

時(shí)間戳 vs. 時(shí)間段

時(shí)間戳是最基本的時(shí)間序列數(shù)據(jù),用于把數(shù)值與時(shí)點(diǎn)關(guān)聯(lián)在一起。Pandas 對(duì)象通過(guò)時(shí)間戳調(diào)用時(shí)點(diǎn)數(shù)據(jù)。

In [28]: pd.Timestamp(datetime.datetime(2012, 5, 1))
Out[28]: Timestamp('2012-05-01 00:00:00')

In [29]: pd.Timestamp('2012-05-01')
Out[29]: Timestamp('2012-05-01 00:00:00')

In [30]: pd.Timestamp(2012, 5, 1)
Out[30]: Timestamp('2012-05-01 00:00:00')

不過(guò),大多數(shù)情況下,用時(shí)間段改變變量更自然。Period 表示的時(shí)間段更直觀,還可以用日期時(shí)間格式的字符串進(jìn)行推斷。

示例如下:

In [31]: pd.Period('2011-01')
Out[31]: Period('2011-01', 'M')

In [32]: pd.Period('2012-05', freq='D')
Out[32]: Period('2012-05-01', 'D')

Timestamp 與 Period 可以用作索引。作為索引的 Timestamp 與 Period 列表則被強(qiáng)制轉(zhuǎn)換為對(duì)應(yīng)的 DatetimeIndex 與 PeriodIndex。

In [33]: dates = [pd.Timestamp('2012-05-01'),
   ....:          pd.Timestamp('2012-05-02'),
   ....:          pd.Timestamp('2012-05-03')]
   ....: 

In [34]: ts = pd.Series(np.random.randn(3), dates)

In [35]: type(ts.index)
Out[35]: pandas.core.indexes.datetimes.DatetimeIndex

In [36]: ts.index
Out[36]: DatetimeIndex(['2012-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)

In [37]: ts
Out[37]: 
2012-05-01    0.469112
2012-05-02   -0.282863
2012-05-03   -1.509059
dtype: float64

In [38]: periods = [pd.Period('2012-01'), pd.Period('2012-02'), pd.Period('2012-03')]

In [39]: ts = pd.Series(np.random.randn(3), periods)

In [40]: type(ts.index)
Out[40]: pandas.core.indexes.period.PeriodIndex

In [41]: ts.index
Out[41]: PeriodIndex(['2012-01', '2012-02', '2012-03'], dtype='period[M]', freq='M')

In [42]: ts
Out[42]: 
2012-01   -1.135632
2012-02    1.212112
2012-03   -0.173215
Freq: M, dtype: float64

Pandas 可以識(shí)別這兩種表現(xiàn)形式,并在兩者之間進(jìn)行轉(zhuǎn)化。Pandas 后臺(tái)用Timestamp 實(shí)例代表時(shí)間戳,用 DatetimeIndex 實(shí)例代表時(shí)間戳序列。pandas 用 Period 對(duì)象表示符合規(guī)律的時(shí)間段標(biāo)量值,用 PeriodIndex 表示時(shí)間段序列。未來(lái)版本將支持用任意起止時(shí)間實(shí)現(xiàn)不規(guī)律時(shí)間間隔。

轉(zhuǎn)換時(shí)間戳

to_datetime 函數(shù)用于轉(zhuǎn)換字符串、紀(jì)元式及混合的日期 Series 或日期列表。轉(zhuǎn)換的是 Series 時(shí),返回的是具有相同的索引的 Series,日期時(shí)間列表則會(huì)被轉(zhuǎn)換為 DatetimeIndex:

In [43]: pd.to_datetime(pd.Series(['Jul 31, 2009', '2010-01-10', None]))
Out[43]: 
0   2009-07-31
1   2010-01-10
2          NaT
dtype: datetime64[ns]

In [44]: pd.to_datetime(['2005/11/23', '2010.12.31'])
Out[44]: DatetimeIndex(['2005-11-23', '2010-12-31'], dtype='datetime64[ns]', freq=None)

解析歐式日期(日-月-年),要用 dayfirst 關(guān)鍵字參數(shù):

In [45]: pd.to_datetime(['04-01-2012 10:00'], dayfirst=True)
Out[45]: DatetimeIndex(['2012-01-04 10:00:00'], dtype='datetime64[ns]', freq=None)

In [46]: pd.to_datetime(['14-01-2012', '01-14-2012'], dayfirst=True)
Out[46]: DatetimeIndex(['2012-01-14', '2012-01-14'], dtype='datetime64[ns]', freq=None)

警告:從上例可以看出,dayfirst 并沒(méi)有那么嚴(yán)苛,如果不能把第一個(gè)數(shù)解析為日,就會(huì)以 dayfirst 為 False 進(jìn)行解析。

to_datetime 轉(zhuǎn)換單個(gè)字符串時(shí),返回的是單個(gè) Timestamp。Timestamp 僅支持字符串輸入,不支持 dayfirst、format 等字符串解析選項(xiàng),如果要使用這些選項(xiàng),就要用 to_datetime。

In [47]: pd.to_datetime('2010/11/12')
Out[47]: Timestamp('2010-11-12 00:00:00')

In [48]: pd.Timestamp('2010/11/12')
Out[48]: Timestamp('2010-11-12 00:00:00')

Pandas 還支持直接使用 DatetimeIndex 構(gòu)建器:

In [49]: pd.DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'])
Out[49]: DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], dtype='datetime64[ns]', freq=None)

創(chuàng)建 DatetimeIndex 時(shí),傳遞字符串 infer 即可推斷索引的頻率。

In [50]: pd.DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], freq='infer')
Out[50]: DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], dtype='datetime64[ns]', freq='2D')

提供格式參數(shù)

要實(shí)現(xiàn)精準(zhǔn)轉(zhuǎn)換,除了傳遞 datetime 字符串,還要指定 format 參數(shù),指定此參數(shù)還可以加速轉(zhuǎn)換速度。

In [51]: pd.to_datetime('2010/11/12', format='%Y/%m/%d')
Out[51]: Timestamp('2010-11-12 00:00:00')

In [52]: pd.to_datetime('12-11-2010 00:00', format='%d-%m-%Y %H:%M')
Out[52]: Timestamp('2010-11-12 00:00:00')

要了解更多 format 選項(xiàng),請(qǐng)參閱 Python 日期時(shí)間文檔。

用多列組合日期時(shí)間

0.18.1 版新增。

Pandas 還可以把 DataFrame 里的整數(shù)或字符串列組合成 Timestamp Series。

In [53]: df = pd.DataFrame({'year': [2015, 2016],
   ....:                    'month': [2, 3],
   ....:                    'day': [4, 5],
   ....:                    'hour': [2, 3]})
   ....: 

In [54]: pd.to_datetime(df)
Out[54]: 
0   2015-02-04 02:00:00
1   2016-03-05 03:00:00
dtype: datetime64[ns]

只傳遞組合所需的列也可以。

In [55]: pd.to_datetime(df[['year', 'month', 'day']])
Out[55]: 
0   2015-02-04
1   2016-03-05
dtype: datetime64[ns]

pd.to_datetime 查找列名里日期時(shí)間組件的標(biāo)準(zhǔn)名稱,包括:

  • 必填:year、month、day

  • 可選:hour、minute、second、millisecond、microsecond、nanosecond

無(wú)效數(shù)據(jù)

不可解析時(shí),默認(rèn)值 errors='raise' 會(huì)觸發(fā)錯(cuò)誤:

In [2]: pd.to_datetime(['2009/07/31', 'asd'], errors='raise')
ValueError: Unknown string format

errors='ignore' 返回原始輸入:

In [56]: pd.to_datetime(['2009/07/31', 'asd'], errors='ignore')
Out[56]: Index(['2009/07/31', 'asd'], dtype='object')

errors='coerce' 把無(wú)法解析的數(shù)據(jù)轉(zhuǎn)換為 NaT,即不是時(shí)間(Not a Time):

In [57]: pd.to_datetime(['2009/07/31', 'asd'], errors='coerce')
Out[57]: DatetimeIndex(['2009-07-31', 'NaT'], dtype='datetime64[ns]', freq=None)

紀(jì)元時(shí)間戳

pandas 支持把整數(shù)或浮點(diǎn)數(shù)紀(jì)元時(shí)間轉(zhuǎn)換為 Timestamp 與 DatetimeIndex。鑒于 Timestamp 對(duì)象內(nèi)部存儲(chǔ)方式,這種轉(zhuǎn)換的默認(rèn)單位是納秒。不過(guò),一般都會(huì)用指定其它時(shí)間單位 unit 來(lái)存儲(chǔ)紀(jì)元數(shù)據(jù),紀(jì)元時(shí)間從 origin 參數(shù)指定的時(shí)點(diǎn)開始計(jì)算。

In [58]: pd.to_datetime([1349720105, 1349806505, 1349892905,
   ....:                 1349979305, 1350065705], unit='s')
   ....: 
Out[58]: 
DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
               '2012-10-10 18:15:05', '2012-10-11 18:15:05',
               '2012-10-12 18:15:05'],
              dtype='datetime64[ns]', freq=None)

In [59]: pd.to_datetime([1349720105100, 1349720105200, 1349720105300,
   ....:                 1349720105400, 1349720105500], unit='ms')
   ....: 
Out[59]: 
DatetimeIndex(['2012-10-08 18:15:05.100000', '2012-10-08 18:15:05.200000',
               '2012-10-08 18:15:05.300000', '2012-10-08 18:15:05.400000',
               '2012-10-08 18:15:05.500000'],
              dtype='datetime64[ns]', freq=None)

用帶 tz 參數(shù)的紀(jì)元時(shí)間戳創(chuàng)建 Timestamp 或 DatetimeIndex 時(shí),要先把紀(jì)元時(shí)間戳轉(zhuǎn)化為 UTC,然后再把結(jié)果轉(zhuǎn)換為指定時(shí)區(qū)。不過(guò)這種操作方式現(xiàn)在已經(jīng)廢棄了,對(duì)于其它時(shí)區(qū) Wall Time 里的紀(jì)元時(shí)間戳,建議先把紀(jì)元時(shí)間戳轉(zhuǎn)換為無(wú)時(shí)區(qū)時(shí)間戳,然后再把時(shí)區(qū)本地化。

In [60]: pd.Timestamp(1262347200000000000).tz_localize('US/Pacific')
Out[60]: Timestamp('2010-01-01 12:00:00-0800', tz='US/Pacific')

In [61]: pd.DatetimeIndex([1262347200000000000]).tz_localize('US/Pacific')
Out[61]: DatetimeIndex(['2010-01-01 12:00:00-08:00'], dtype='datetime64[ns, US/Pacific]', freq=None)

注意:紀(jì)元時(shí)間取整到最近的納秒。

警告:Python 浮點(diǎn)數(shù)只精確到 15 位小數(shù),因此,轉(zhuǎn)換浮點(diǎn)紀(jì)元時(shí)間可能會(huì)導(dǎo)致不精準(zhǔn)或失控的結(jié)果。轉(zhuǎn)換過(guò)程中,免不了會(huì)對(duì)高精度 Timestamp 取整,只有用 int64 等定寬類型才有可能實(shí)現(xiàn)極其精準(zhǔn)的效果。

In [62]: pd.to_datetime([1490195805.433, 1490195805.433502912], unit='s')
Out[62]: DatetimeIndex(['2017-03-22 15:16:45.433000088', '2017-03-22 >15:16:45.433502913'], dtype='datetime64[ns]', freq=None)
In [63]: pd.to_datetime(1490195805433502912, unit='ns')
Out[63]: Timestamp('2017-03-22 15:16:45.433502912')

參閱:應(yīng)用 origin 參數(shù)

把時(shí)間戳轉(zhuǎn)換為紀(jì)元

反轉(zhuǎn)上述操作,把 Timestamp 轉(zhuǎn)換為 unix 紀(jì)元:

In [64]: stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')

In [65]: stamps
Out[65]: 
DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
               '2012-10-10 18:15:05', '2012-10-11 18:15:05'],
              dtype='datetime64[ns]', freq='D')

首先與紀(jì)元開始時(shí)點(diǎn)(1970 年 1 月 1 日午夜,UTC)相減,然后以 1 秒為時(shí)間單位(unit='1s')取底整除。

In [66]: (stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')
Out[66]: Int64Index([1349720105, 1349806505, 1349892905, 1349979305], dtype='int64')

應(yīng)用 `origin` 參數(shù)

0.20.0 版新增。

origin 參數(shù)可以指定 DatetimeIndex 的備選開始時(shí)點(diǎn)。例如,把1960-01-01作為開始日期:

In [67]: pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))
Out[67]: DatetimeIndex(['1960-01-02', '1960-01-03', '1960-01-04'], dtype='datetime64[ns]', freq=None)

默認(rèn)值為 origin='unix',即 1970-01-01 00:00:00,一般把這個(gè)時(shí)點(diǎn)稱為 unix 紀(jì)元 或 POSIX 時(shí)間。

In [68]: pd.to_datetime([1, 2, 3], unit='D')
Out[68]: DatetimeIndex(['1970-01-02', '1970-01-03', '1970-01-04'], dtype='datetime64[ns]', freq=None)

生成時(shí)間戳范圍

DatetimeIndex、Index 構(gòu)建器可以生成時(shí)間戳索引,此處要提供 datetime 對(duì)象列表。

In [69]: dates = [datetime.datetime(2012, 5, 1),
   ....:          datetime.datetime(2012, 5, 2),
   ....:          datetime.datetime(2012, 5, 3)]
   ....: 

# 注意頻率信息
In [70]: index = pd.DatetimeIndex(dates)

In [71]: index
Out[71]: DatetimeIndex(['2012-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)

# 自動(dòng)轉(zhuǎn)換為 DatetimeIndex
In [72]: index = pd.Index(dates)

In [73]: index
Out[73]: DatetimeIndex(['2012-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)

實(shí)際工作中,經(jīng)常要生成含大量時(shí)間戳的超長(zhǎng)索引,一個(gè)個(gè)輸入時(shí)間戳又枯燥,又低效。如果時(shí)間戳是定頻的,用 date_range() 與 bdate_range() 函數(shù)即可創(chuàng)建DatetimeIndex。date_range 默認(rèn)的頻率是日歷日,bdate_range 的默認(rèn)頻率是工作日:

In [74]: start = datetime.datetime(2011, 1, 1)

In [75]: end = datetime.datetime(2012, 1, 1)

In [76]: index = pd.date_range(start, end)

In [77]: index
Out[77]: 
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04',
               '2011-01-05', '2011-01-06', '2011-01-07', '2011-01-08',
               '2011-01-09', '2011-01-10',
               ...
               '2011-12-23', '2011-12-24', '2011-12-25', '2011-12-26',
               '2011-12-27', '2011-12-28', '2011-12-29', '2011-12-30',
               '2011-12-31', '2012-01-01'],
              dtype='datetime64[ns]', length=366, freq='D')

In [78]: index = pd.bdate_range(start, end)

In [79]: index
Out[79]: 
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
               '2011-01-07', '2011-01-10', '2011-01-11', '2011-01-12',
               '2011-01-13', '2011-01-14',
               ...
               '2011-12-19', '2011-12-20', '2011-12-21', '2011-12-22',
               '2011-12-23', '2011-12-26', '2011-12-27', '2011-12-28',
               '2011-12-29', '2011-12-30'],
              dtype='datetime64[ns]', length=260, freq='B')

date_range、bdate_range 等便捷函數(shù)可以調(diào)用各種頻率別名:

In [80]: pd.date_range(start, periods=1000, freq='M')
Out[80]: 
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30',
               '2011-05-31', '2011-06-30', '2011-07-31', '2011-08-31',
               '2011-09-30', '2011-10-31',
               ...
               '2093-07-31', '2093-08-31', '2093-09-30', '2093-10-31',
               '2093-11-30', '2093-12-31', '2094-01-31', '2094-02-28',
               '2094-03-31', '2094-04-30'],
              dtype='datetime64[ns]', length=1000, freq='M')

In [81]: pd.bdate_range(start, periods=250, freq='BQS')
Out[81]: 
DatetimeIndex(['2011-01-03', '2011-04-01', '2011-07-01', '2011-10-03',
               '2012-01-02', '2012-04-02', '2012-07-02', '2012-10-01',
               '2013-01-01', '2013-04-01',
               ...
               '2071-01-01', '2071-04-01', '2071-07-01', '2071-10-01',
               '2072-01-01', '2072-04-01', '2072-07-01', '2072-10-03',
               '2073-01-02', '2073-04-03'],
              dtype='datetime64[ns]', length=250, freq='BQS-JAN')

date_range 與 bdate_range 通過(guò)指定 start、end、period 與 freq 等參數(shù),簡(jiǎn)化了生成日期范圍這項(xiàng)工作。開始與結(jié)束日期是必填項(xiàng),因此,不會(huì)生成指定范圍之外的日期。

In [82]: pd.date_range(start, end, freq='BM')
Out[82]: 
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
               '2011-05-31', '2011-06-30', '2011-07-29', '2011-08-31',
               '2011-09-30', '2011-10-31', '2011-11-30', '2011-12-30'],
              dtype='datetime64[ns]', freq='BM')

In [83]: pd.date_range(start, end, freq='W')
Out[83]: 
DatetimeIndex(['2011-01-02', '2011-01-09', '2011-01-16', '2011-01-23',
               '2011-01-30', '2011-02-06', '2011-02-13', '2011-02-20',
               '2011-02-27', '2011-03-06', '2011-03-13', '2011-03-20',
               '2011-03-27', '2011-04-03', '2011-04-10', '2011-04-17',
               '2011-04-24', '2011-05-01', '2011-05-08', '2011-05-15',
               '2011-05-22', '2011-05-29', '2011-06-05', '2011-06-12',
               '2011-06-19', '2011-06-26', '2011-07-03', '2011-07-10',
               '2011-07-17', '2011-07-24', '2011-07-31', '2011-08-07',
               '2011-08-14', '2011-08-21', '2011-08-28', '2011-09-04',
               '2011-09-11', '2011-09-18', '2011-09-25', '2011-10-02',
               '2011-10-09', '2011-10-16', '2011-10-23', '2011-10-30',
               '2011-11-06', '2011-11-13', '2011-11-20', '2011-11-27',
               '2011-12-04', '2011-12-11', '2011-12-18', '2011-12-25',
               '2012-01-01'],
              dtype='datetime64[ns]', freq='W-SUN')

In [84]: pd.bdate_range(end=end, periods=20)
Out[84]: 
DatetimeIndex(['2011-12-05', '2011-12-06', '2011-12-07', '2011-12-08',
               '2011-12-09', '2011-12-12', '2011-12-13', '2011-12-14',
               '2011-12-15', '2011-12-16', '2011-12-19', '2011-12-20',
               '2011-12-21', '2011-12-22', '2011-12-23', '2011-12-26',
               '2011-12-27', '2011-12-28', '2011-12-29', '2011-12-30'],
              dtype='datetime64[ns]', freq='B')

In [85]: pd.bdate_range(start=start, periods=20)
Out[85]: 
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
               '2011-01-07', '2011-01-10', '2011-01-11', '2011-01-12',
               '2011-01-13', '2011-01-14', '2011-01-17', '2011-01-18',
               '2011-01-19', '2011-01-20', '2011-01-21', '2011-01-24',
               '2011-01-25', '2011-01-26', '2011-01-27', '2011-01-28'],
              dtype='datetime64[ns]', freq='B')

0.23.0 版新增。

指定 start、end、periods 即可生成從 start 開始至 end 結(jié)束的等距日期范圍,這個(gè)日期范圍包含了 start 與 end,生成的 DatetimeIndex 里的元素?cái)?shù)量為 periods 的值。

In [86]: pd.date_range('2018-01-01', '2018-01-05', periods=5)
Out[86]: 
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05'],
              dtype='datetime64[ns]', freq=None)

In [87]: pd.date_range('2018-01-01', '2018-01-05', periods=10)
Out[87]: 
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 10:40:00',
               '2018-01-01 21:20:00', '2018-01-02 08:00:00',
               '2018-01-02 18:40:00', '2018-01-03 05:20:00',
               '2018-01-03 16:00:00', '2018-01-04 02:40:00',
               '2018-01-04 13:20:00', '2018-01-05 00:00:00'],
              dtype='datetime64[ns]', freq=None)

自定義頻率范圍

設(shè)定 weekmask 與 holidays 參數(shù),bdate_range 還可以生成自定義頻率日期范圍。這些參數(shù)只用于傳遞自定義字符串。

In [88]: weekmask = 'Mon Wed Fri'

In [89]: holidays = [datetime.datetime(2011, 1, 5), datetime.datetime(2011, 3, 14)]

In [90]: pd.bdate_range(start, end, freq='C', weekmask=weekmask, holidays=holidays)
Out[90]: 
DatetimeIndex(['2011-01-03', '2011-01-07', '2011-01-10', '2011-01-12',
               '2011-01-14', '2011-01-17', '2011-01-19', '2011-01-21',
               '2011-01-24', '2011-01-26',
               ...
               '2011-12-09', '2011-12-12', '2011-12-14', '2011-12-16',
               '2011-12-19', '2011-12-21', '2011-12-23', '2011-12-26',
               '2011-12-28', '2011-12-30'],
              dtype='datetime64[ns]', length=154, freq='C')

In [91]: pd.bdate_range(start, end, freq='CBMS', weekmask=weekmask)
Out[91]: 
DatetimeIndex(['2011-01-03', '2011-02-02', '2011-03-02', '2011-04-01',
               '2011-05-02', '2011-06-01', '2011-07-01', '2011-08-01',
               '2011-09-02', '2011-10-03', '2011-11-02', '2011-12-02'],
              dtype='datetime64[ns]', freq='CBMS')

時(shí)間戳的界限

Pandas 時(shí)間戳的最低單位為納秒,64 位整數(shù)顯示的時(shí)間跨度約為 584 年,這就是Timestamp 的界限:

In [92]: pd.Timestamp.min
Out[92]: Timestamp('1677-09-21 00:12:43.145225')

In [93]: pd.Timestamp.max
Out[93]: Timestamp('2262-04-11 23:47:16.85477580

到此,相信大家對(duì)“怎么理解Pandas時(shí)間序列”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI