簡介
時間分類
timestamp
datetimeindex
date_range 和 bdate_range
`origin`
格式化
period
dateoffset
作為index
切片和完全比對
時間序列的操作
shifting
頻率轉換
resampling 重新取樣
簡介
時間應該是在資料進行中經常會用到的一種資料類型,除了numpy中datetime64 和 timedelta64 這兩種資料類型之外,pandas 還整合了其他python庫比如 <code>scikits.timeseries</code> 中的功能。
時間分類
pandas中有四種時間類型:
date times : 日期和時間,可以帶時區。和标準庫中的 <code>datetime.datetime</code> 類似。
time deltas: 絕對持續時間,和 标準庫中的 <code>datetime.timedelta</code> 類似。
time spans: 由時間點及其關聯的頻率定義的時間跨度。
date offsets:基于月曆計算的時間 和 dateutil.relativedelta.relativedelta 類似。
我們用一張表來表示:
<col>
類型
标量class
數組class
pandas資料類型
主要建立方法
date times
<code>timestamp</code>
<code>datetimeindex</code>
<code>datetime64[ns]</code> or <code>datetime64[ns, tz]</code>
<code>to_datetime</code> or <code>date_range</code>
time deltas
<code>timedelta</code>
<code>timedeltaindex</code>
<code>timedelta64[ns]</code>
<code>to_timedelta</code> or <code>timedelta_range</code>
time spans
<code>period</code>
<code>periodindex</code>
<code>period[freq]</code>
<code>period</code> or <code>period_range</code>
date offsets
<code>dateoffset</code>
<code>none</code>
看一個使用的例子:
看一下上面資料類型的空值:
timestamp
timestamp 是最基礎的時間類型,我們可以這樣建立:
timestamp 作為index會自動被轉換為datetimeindex:
還可以使用 date_range 來建立datetimeindex:
<code>date_range</code> 是月曆範圍,<code>bdate_range</code> 是工作日範圍:
兩個方法都可以帶上 <code>start</code>, <code>end</code>, 和 <code>periods</code>參數。
使用 <code>origin</code>參數,可以修改 <code>datetimeindex</code> 的起點:
預設情況下 <code>origin='unix'</code>, 也就是起點是 <code>1970-01-01 00:00:00</code>.
使用format參數可以對時間進行格式化:
period
period 表示的是一個時間跨度,通常和freq一起使用:
period可以直接進行運算:
注意,period隻有具有相同的freq才能進行算數運算。包括 offsets 和 timedelta
period作為index可以自動被轉換為periodindex:
可以通過 pd.period_range 方法來建立 periodindex:
還可以通過periodindex直接建立:
dateoffset
dateoffset表示的是頻率對象。它和timedelta很類似,表示的是一個持續時間,但是有特殊的月曆規則。比如timedelta一天肯定是24小時,而在 dateoffset中根據夏令時的不同,一天可能會有23,24或者25小時。
dateoffsets 和frequency 運算是先關的,看一下可用的date offset 和它相關聯的 frequency:
date offset
frequency string
描述
none
通用的offset 類
<code>bday</code> or <code>businessday</code>
<code>'b'</code>
工作日
<code>cday</code> or <code>custombusinessday</code>
<code>'c'</code>
自定義的工作日
<code>week</code>
<code>'w'</code>
一周
<code>weekofmonth</code>
<code>'wom'</code>
每個月的第幾周的第幾天
<code>lastweekofmonth</code>
<code>'lwom'</code>
每個月最後一周的第幾天
<code>monthend</code>
<code>'m'</code>
月曆月末
monthbegin
<code>'ms'</code>
月曆月初
<code>bmonthend</code> or <code>businessmonthend</code>
<code>'bm'</code>
營業月底
<code>bmonthbegin</code> or <code>businessmonthbegin</code>
<code>'bms'</code>
營業月初
<code>cbmonthend</code> or <code>custombusinessmonthend</code>
<code>'cbm'</code>
自定義營業月底
<code>cbmonthbegin</code> or <code>custombusinessmonthbegin</code>
<code>'cbms'</code>
自定義營業月初
<code>semimonthend</code>
<code>'sm'</code>
月曆月末的第15天
<code>semimonthbegin</code>
<code>'sms'</code>
月曆月初的第15天
<code>quarterend</code>
<code>'q'</code>
月曆季末
<code>quarterbegin</code>
<code>'qs'</code>
月曆季初
<code>bquarterend</code>
<code>'bq</code>
工作季末
<code>bquarterbegin</code>
<code>'bqs'</code>
工作季初
<code>fy5253quarter</code>
<code>'req'</code>
零售季( 52-53 week)
<code>yearend</code>
<code>'a'</code>
月曆年末
<code>yearbegin</code>
<code>'as'</code> or <code>'bys'</code>
月曆年初
<code>byearend</code>
<code>'ba'</code>
營業年末
<code>byearbegin</code>
<code>'bas'</code>
營業年初
<code>fy5253</code>
<code>'re'</code>
零售年 (aka 52-53 week)
<code>easter</code>
複活節假期
<code>businesshour</code>
<code>'bh'</code>
business hour
<code>custombusinesshour</code>
<code>'cbh'</code>
custom business hour
<code>day</code>
<code>'d'</code>
一天的絕對時間
<code>hour</code>
<code>'h'</code>
一小時
<code>minute</code>
<code>'t'</code> or <code>'min'</code>
一分鐘
<code>second</code>
<code>'s'</code>
一秒鐘
<code>milli</code>
<code>'l'</code> or <code>'ms'</code>
一微妙
<code>micro</code>
<code>'u'</code> or <code>'us'</code>
一毫秒
<code>nano</code>
<code>'n'</code>
一納秒
dateoffset還有兩個方法 <code>rollforward()</code> 和 <code>rollback()</code> 可以将時間進行移動:
上面的操作會自動儲存小時,分鐘等資訊,如果想要設定為 00:00:00 , 可以調用normalize() 方法:
作為index
時間可以作為index,并且作為index的時候會有一些很友善的特性。
可以直接使用時間來擷取相應的資料:
擷取全年的資料:
擷取某個月的資料:
df可以接受時間作為loc的參數:
時間切片:
考慮下面的一個精度為分的series對象:
時間精度小于分的話,傳回的是一個series對象:
時間精度大于分的話,傳回的是一個常量:
同樣的,如果精度為秒的話,小于秒會傳回一個對象,等于秒會傳回常量值。
時間序列的操作
使用shift方法可以讓 time series 進行相應的移動:
通過指定 freq , 可以設定shift的方式:
時間序列可以通過調用 asfreq 的方法轉換其頻率:
asfreq還可以指定修改頻率過後的填充方法:
resampling 重新取樣
給定的時間序列可以通過調用resample方法來重新取樣:
resample 可以接受各類統計方法,比如: <code>sum</code>, <code>mean</code>, <code>std</code>, <code>sem</code>, <code>max</code>, <code>min</code>, <code>median</code>, <code>first</code>, <code>last</code>, <code>ohlc</code>。
歡迎關注我的公衆号:「程式那些事」,懂技術,更懂你!