1. 時間序列基礎數組
import numpy as npdom
import pandas as pdspa
np.random.seed(12345).net
import matplotlib.pyplot as plt3d
plt.rc('figure', figsize=(10, 6))對象
PREVIOUS_MAX_ROWS = pd.options.display.max_rowsblog
pd.options.display.max_rows = 20排序
np.set_printoptions(precision=4, suppress=True)索引
pandas最基本的時間序列類型就是以時間戳(一般以Python字符串或datatime對象表示)爲索引的Series:內存
from datetime import datetime
dates = [datetime(2011, 1, 2), datetime(2011, 1, 5),
datetime(2011, 1, 7), datetime(2011, 1, 8),
datetime(2011, 1, 10), datetime(2011, 1, 12)]
ts = pd.Series(np.random.randn(6), index=dates)
ts
這些datetime對象其實是被放在一個DatetimeIndex中的:
ts.index
跟其餘Series同樣,不一樣索引的時間序列之間的算術運算會自動按日期對 齊:
print(ts[::2]) #每隔一個取一個
ts + ts[::2]
pandas用NumPy的datetime64數據類型以納秒形式存儲時間戳:
ts.index.dtype
DatetimeIndex中的各個標量值是pandas的Timestamp對象:
stamp = ts.index[0]
stamp
只要有須要,TimeStamp能夠隨時自動轉換爲datetime對象。此外,它還能夠存儲頻率信息(若是有的話),且知道如何執行時區轉換以及其餘操做。 以後將對此進行詳細講解。
2. 索引、選取、子集構造
當你根據標籤索引選取數據時,時間序列和其它的pandas.Series很像:
print(ts)
stamp = ts.index[2]
print(ts[stamp]) #標籤索引
print(ts[2]) #整數索引
還有一種更爲方便的用法:傳入一個能夠被解釋爲日期的字符串:
print(ts['1/10/2011'])
print(ts['20110110'])
ts['2011-01-10']
對於較長的時間序列,只需傳入「年」或「年月」便可輕鬆選取數據的切片:
longer_ts = pd.Series(np.random.randn(1000),
index=pd.date_range('1/1/2000', periods=1000))#天爲單位
longer_ts
longer_ts['2001']
這裏,字符串「2001」被解釋成年,並根據它選取時間區間。指定月也一樣奏效:
longer_ts['2001-05']
datetime對象也能夠進行切片:
print(ts)
ts[datetime(2011, 1, 7):]
因爲大部分時間序列數據都是按照時間前後排序的,所以你也能夠用不存在於該時間序列中的時間戳對其進行切片(即範圍查詢):
ts['1/6/2011':'1/11/2011']
跟以前同樣,你能夠傳入字符串日期、datetime或Timestamp進行索引。注意,這樣 切片所產生的是原時間序列的視圖(共享內存),跟NumPy數組的切片運算是同樣的。
這意味着,沒有數據被複制,對切片進行修改會反映到原始數據上。
此外,還有一個等價的實例方法也能夠截取兩個日期之間TimeSeries:
ts.truncate(after='1/9/2011')無錫婦科醫院哪家好 http://www.xasgyy.net/
這些操做對DataFrame也有效。例如,對DataFrame的行進行索引:
dates = pd.date_range('1/1/2000', periods=100, freq='W-WED') #間隔單位爲周
long_df = pd.DataFrame(np.random.randn(100, 4),
index=dates,
columns=['Colorado', 'Texas',
'New York', 'Ohio'])
long_df.loc['5-2001']
3. 帶有重複索引值的時間序列
在某些應用場景中,可能會存在多個觀測數據落在同一個時間點上的狀況。下面就是一個例子:
dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000',
'1/2/2000', '1/3/2000'])
dup_ts = pd.Series(np.arange(5), index=dates)
dup_ts
經過檢查索引的is_unique屬性,咱們就能夠知道它是否是惟一的:
dup_ts.index.is_unique
對這個時間序列進行索引,要麼產生標量值,要麼產生切片,具體要看所選的時間點是否重複:
print(dup_ts['1/3/2000'])# not duplicated
dup_ts['1/2/2000'] # duplicated
假設你想要對具備非惟一時間戳的數據進行聚合。一個辦法是使用 groupby,並傳入level=0:
grouped = dup_ts.groupby(level=0)
print(grouped.mean())
grouped.count()