依託 NumPy 的 datetime64、timedelta64 等數據類型,pandas 可以處理各種時間序列數據,還能調用 scikits.timeseries 等 Python 支持庫的時間序列功能。
Pandas 支持以下操作:
解析時間格式字符串、np.datetime64、datetime.datetime 等多種時間序列數據。
<code>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
)/<code>
生成 DatetimeIndex、TimedeltaIndex、PeriodIndex 等定頻日期與時間段序列。
<code>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'
)/<code>
處理、轉換帶時區的日期時間數據。
<code>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'
)/<code>
按指定頻率重採樣,並轉換為時間序列。
<code>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
/<code>
用絕對或相對時間差計算日期與時間。
<code>In
[13
]: friday = pd.Timestamp('2018-01-05'
) In [14
]: friday.day_name() Out[14
]:'Friday'
In [15
]: saturday = friday + pd.Timedelta('1 day'
) In [16
]: saturday.day_name() Out[16
]:'Saturday'
In [17
]: monday = friday + pd.offsets.BDay() In [18
]: monday.day_name() Out[18
]:'Monday'
/<code>
Pandas 提供了一組精悍、實用的工具集以完成上述操作。
時間序列縱覽
Pandas 支持 4 種常見時間概念:
- 日期時間(Datetime):帶時區的日期時間,類似於標準庫的datetime.datetime 。
- 時間差(Timedelta):絕對時間週期,類似於標準庫的datetime.timedelta。
- 時間段(Timespan):在某一時點以指定頻率定義的時間跨度。
- 日期偏移(Dateoffset):與日曆運算對應的時間段,類似 dateutil 的dateutil.relativedelta.relativedelta。
一般情況下,時間序列主要是 Series 或 DataFrame 的時間型索引,可以用時間元素進行操控。
<code>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
/<code>
當然,Series 與 DataFrame 也可以直接把時間序列當成數據。
<code>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]
/<code>
Series 與 DataFrame 提供了 datetime、timedelta 、Period 擴展類型與專有用法,不過,Dateoffset 則保存為 object。
<code>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
1
*
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]
/<code>
Pandas 用 NaT 表示日期時間、時間差及時間段的空值,代表了缺失日期或空日期的值,類似於浮點數的 np.nan。
<code>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
In [27]: pd.NaT == pd.NaTOut[27]: False
/<code>
時間戳 vs. 時間段
時間戳是最基本的時間序列數據,用於把數值與時點關聯在一起。Pandas 對象通過時間戳調用時點數據。
<code>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'
)/<code>
不過,大多數情況下,用時間段改變變量更自然。Period 表示的時間段更直觀,還可以用日期時間格式的字符串進行推斷。
示例如下:
<code>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'
)/<code>
Timestamp 與 Period 可以用作索引。作為索引的 Timestamp 與 Period 列表則被強制轉換為對應的 DatetimeIndex 與 PeriodIndex。
<code>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
/<code>
Pandas 可以識別這兩種表現形式,並在兩者之間進行轉化。Pandas 後臺用Timestamp 實例代表時間戳,用 DatetimeIndex 實例代表時間戳序列。pandas 用 Period 對象表示符合規律的時間段標量值,用 PeriodIndex 表示時間段序列。未來版本將支持用任意起止時間實現不規律時間間隔。
轉換時間戳
to_datetime 函數用於轉換字符串、紀元式及混合的日期 Series 或日期列表。轉換的是 Series 時,返回的是具有相同的索引的 Series,日期時間列表則會被轉換為 DatetimeIndex:
<code>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)/<code>
解析歐式日期(日-月-年),要用 dayfirst 關鍵字參數:
<code>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)/<code>
警告:從上例可以看出,dayfirst 並沒有那麼嚴苛,如果不能把第一個數解析為日,就會以 dayfirst 為 False 進行解析。
to_datetime 轉換單個字符串時,返回的是單個 Timestamp。Timestamp 僅支持字符串輸入,不支持 dayfirst、format 等字符串解析選項,如果要使用這些選項,就要用 to_datetime。
<code>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'
)/<code>
Pandas 還支持直接使用 DatetimeIndex 構建器:
<code>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)/<code>
創建 DatetimeIndex 時,傳遞字符串 infer 即可推斷索引的頻率。
<code>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'
)/<code>
提供格式參數
要實現精準轉換,除了傳遞 datetime 字符串,還要指定 format 參數,指定此參數還可以加速轉換速度。
<code>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'
)/<code>
要了解更多 format 選項,請參閱 Python 日期時間文檔。
用多列組合日期時間
0.18.1 版新增。
Pandas 還可以把 DataFrame 裡的整數或字符串列組合成 Timestamp Series。
<code>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]
/<code>
只傳遞組合所需的列也可以。
<code>In
[55]
:pd
.to_datetime
(df
[[
'year'
,'month'
,'day'
]])Out
[55]
: 0 2015-02-04
1 2016-03-05
dtype
:datetime64
[ns]
/<code>
pd.to_datetime 查找列名裡日期時間組件的標準名稱,包括:
- 必填:year、month、day
- 可選:hour、minute、second、millisecond、microsecond、nanosecond
無效數據
不可解析時,默認值 errors='raise' 會觸發錯誤:
<code>In
[2]
:pd
.to_datetime
(['2009/07/31'
,'asd'
], errors='raise'
)ValueError
:Unknown
string
format
/<code>
errors='ignore' 返回原始輸入:
<code>In
[56]
:pd
.to_datetime
(['2009/07/31'
,'asd'
], errors='ignore'
)Out
[56]
:Index
(['2009/07/31'
,'asd'
], dtype='object'
)/<code>
errors='coerce' 把無法解析的數據轉換為 NaT,即不是時間(Not a Time):
<code>In
[57]
:pd
.to_datetime
(['2009/07/31'
,'asd'
], errors='coerce'
)Out
[57]
:DatetimeIndex
(['2009-07-31'
,'NaT'
], dtype='datetime64[ns]'
, freq=None)/<code>
紀元時間戳
pandas 支持把整數或浮點數紀元時間轉換為 Timestamp 與 DatetimeIndex。鑑於 Timestamp 對象內部存儲方式,這種轉換的默認單位是納秒。不過,一般都會用指定其它時間單位 unit 來存儲紀元數據,紀元時間從 origin 參數指定的時點開始計算。
<code>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)/<code>
用帶 tz 參數的紀元時間戳創建 Timestamp 或 DatetimeIndex 時,要先把紀元時間戳轉化為 UTC,然後再把結果轉換為指定時區。不過這種操作方式現在已經廢棄了,對於其它時區 Wall Time 裡的紀元時間戳,建議先把紀元時間戳轉換為無時區時間戳,然後再把時區本地化。
<code>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)/<code>
注意:紀元時間取整到最近的納秒。
警告:Python 浮點數只精確到 15 位小數,因此,轉換浮點紀元時間可能會導致不精準或失控的結果。轉換過程中,免不了會對高精度 Timestamp 取整,只有用 int64 等定寬類型才有可能實現極其精準的效果。
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')
參閱:應用 origin 參數
把時間戳轉換為紀元
反轉上述操作,把 Timestamp 轉換為 unix 紀元:
<code>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'
)/<code>
首先與紀元開始時點(1970 年 1 月 1 日午夜,UTC)相減,然後以 1 秒為時間單位(unit='1s')取底整除。
<code>In
[66]
: (stamps - pd.Timestamp("1970-01-01"
))Out
[66]
:Int64Index
([1349720105
,1349806505
,1349892905
,1349979305
], dtype='int64'
)/<code>
應用 `origin` 參數
0.20.0 版新增。
origin 參數可以指定 DatetimeIndex 的備選開始時點。例如,把1960-01-01作為開始日期:
<code>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)/<code>
默認值為 origin='unix',即 1970-01-01 00:00:00,一般把這個時點稱為 unix 紀元 或 POSIX 時間。
<code>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)/<code>
生成時間戳範圍
DatetimeIndex、Index 構建器可以生成時間戳索引,此處要提供 datetime 對象列表。
<code>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) 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)/<code>
實際工作中,經常要生成含大量時間戳的超長索引,一個個輸入時間戳又枯燥,又低效。如果時間戳是定頻的,用 date_range() 與 bdate_range() 函數即可創建DatetimeIndex。date_range 默認的頻率是日曆日,bdate_range 的默認頻率是工作日:
<code>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'
)/<code>
date_range、bdate_range 等便捷函數可以調用各種頻率別名:
<code>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'
)/<code>
date_range 與 bdate_range 通過指定 start、end、period 與 freq 等參數,簡化了生成日期範圍這項工作。開始與結束日期是必填項,因此,不會生成指定範圍之外的日期。
<code>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'
)/<code>
0.23.0 版新增。
指定 start、end、periods 即可生成從 start 開始至 end 結束的等距日期範圍,這個日期範圍包含了 start 與 end,生成的 DatetimeIndex 裡的元素數量為 periods 的值。
<code>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)/<code>
自定義頻率範圍
設定 weekmask 與 holidays 參數,bdate_range 還可以生成自定義頻率日期範圍。這些參數只用於傳遞自定義字符串。
<code>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'
)/<code>
參閱:自定義工作日
時間戳的界限
Pandas 時間戳的最低單位為納秒,64 位整數顯示的時間跨度約為 584 年,這就是Timestamp 的界限:
<code>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
/<code>
好吧,夥伴們,我知道你們都會了,畢竟你們都是如此聰慧!
更多的python相關學習教程也會繼續更新,有給大家整理全套的python教程和人工智能
全套視頻教程,夥伴們有要學的,評論留言回覆:python/人工智能,即可領取!