版本 0.8.0(2012 年 6 月 29 日)#
這是從 0.7.3 版本開始的一次重大更新,在時間序列處理和基礎設施方面進行了大量的改進,並在整個庫中增加了許多新功能。它包含來自 20 多位作者的 700 多個提交。大多數 pandas 0.7.3 及更早版本的使用者在升級時應該不會遇到任何問題,但由於遷移到了 NumPy 的 datetime64 資料型別,可能會存在一些錯誤和不相容之處。如果需要,將在 0.8.1 版本中儘快修復遺留的不相容性。請參閱 完整的釋出說明 或 GitHub 上的問題跟蹤器以獲取完整列表。
支援非唯一索引#
所有物件現在都可以使用非唯一索引。資料對齊/連線操作遵循 SQL 連線語義(包括,如果適用,在多對多連線中複製索引)。
NumPy datetime64 資料型別和 1.6 依賴項#
時間序列資料現在使用 NumPy 的 datetime64 資料型別表示;因此,pandas 0.8.0 現在至少需要 NumPy 1.6。它已經過測試並驗證可以與 NumPy 的開發版本 (1.7+) 一起工作,該版本還包含一些重大的面向使用者的 API 更改。NumPy 1.6 還存在一些與納秒解析度資料相關的錯誤,因此我建議您避免使用 NumPy 1.6 的 datetime64 API 函式(儘管它們有限),並且只通過 pandas 提供的介面與這些資料進行互動。
請參閱 0.8.0 部分末尾的“移植”指南,其中列出了從 pandas 0.7 或更早版本遷移到 0.8.0 的舊程式碼庫的使用者的潛在問題。
對於使用舊版 NumPy < 1.6 的使用者,將在出現問題時提供 0.7.x 系列的錯誤修復。0.7.x 系列除了錯誤修復之外,將不再進行任何進一步的開發。
時間序列更改和改進#
注意
透過此次釋出,舊版 scikits.timeseries 使用者應該能夠將其程式碼移植到使用 pandas。
注意
有關 pandas 時間序列 API 的概述,請參閱 文件。
新的 datetime64 表示法**加快了連線操作和資料對齊**,**減少了記憶體使用**,並顯著提高了與 datetime.datetime 相比的序列化/反序列化效能。
高效能靈活的 **resample** 方法,用於從高頻到低頻和從低頻到高頻的轉換。支援插值、使用者定義的聚合函式,以及對間隔和結果標籤定義的控制。還實現了一套高效能的 Cython/C 基礎重取樣函式(包括 Open-High-Low-Close)。
對頻率別名的改進,並支援**頻率快捷方式**,如 '15min' 或 '1h30min'。
新的 DatetimeIndex 類 支援固定頻率和不規則時間序列。取代了現已棄用的 DateRange 類。
新的
PeriodIndex和Period類,用於表示時間跨度和執行**日曆邏輯**,包括12 個 財年 季度 頻率 <timeseries.quarterly>。這是對 scikits.timeseries 程式碼庫元素的區域性移植和實質性增強。支援 PeriodIndex 和 DatetimeIndex 之間的轉換。新的 Timestamp 資料型別繼承自
datetime.datetime,提供相同的介面,同時支援納秒解析度資料。還提供便捷的時區轉換。增強了對時區的支援。向 TimeSeries 和 DataFrame 添加了
tz_convert和tz_localize方法。所有時間戳都以 UTC 儲存;來自設定了時區的 DatetimeIndex 物件的 Timsestamp 將被本地化為本地時間。因此,時區轉換幾乎是免費的。使用者現在只需要瞭解很少的 pytz 庫;只需要時區名稱作為字串。時區感應的時間戳僅在它們的 UTC 時間戳匹配時才相等。具有不同時區的時間序列之間的操作將導致一個 UTC 索引的時間序列。時間序列**字串索引的便捷性** / 快捷方式:按年份、年和月切片,以及使用字串索引值。
增強的時間序列**繪圖**;移植了 scikits.timeseries 基於 matplotlib 的繪圖程式碼。
新的
date_range、bdate_range和period_range工廠函式。魯棒的**頻率推斷**函式
infer_freq和 DatetimeIndex 的inferred_freq屬性,可選在構造 DatetimeIndex 時推斷頻率。to_datetime 函式高效地**解析字串陣列**到 DatetimeIndex。DatetimeIndex 將解析字串陣列或列表到 datetime64。
**最佳化**了 Series 和 DataFrame 列中 datetime64 資料型別的支援。
新的 NaT (Not-a-Time) 型別,用於表示時間戳陣列中的**NA**。
最佳化 Series.asof,用於查詢時間戳陣列的**“as of”值**。
Milli、Micro、Nano 日期偏移物件。
可以使用 datetime.time 物件索引時間序列,以選擇特定**一天中的時間**(
TimeSeries.at_time)或**兩個時間之間**(TimeSeries.between_time)的所有資料。添加了 tshift 方法,用於基於索引的頻率(如果存在)進行前移/後移,而不是使用簡單的 shift 進行前移/後移。
其他新功能#
新的 cut 和
qcut函式(類似於 R 的 cut 函式),透過將值分箱(基於值(cut)或基於分位數(qcut)的箱)來從連續變數計算分類變數。將
Factor重新命名為Categorical,並添加了許多可用性功能。向 fillna/reindex 添加了 limit 引數。
GroupBy 中更靈活的多函式應用,可以傳遞 (名稱, 函式) 元組列表,以獲得特定順序和名稱的結果。
添加了靈活的 replace 方法,用於高效地替換值。
增強了 read_csv/read_table,用於讀取時間序列資料並將多個列轉換為日期。
向解析器函式(read_csv 等)添加了 comments 選項。
向解析器函式添加了 dayfirst 選項,用於解析國際 DD/MM/YYYY 日期。
允許使用者指定 CSV 讀取器的 dialect 以控制引用等。
處理 read_csv 中的千位分隔符,以提高整數解析效率。
支援一次性取消堆疊多個級別。緩解了
pivot_table中的錯誤(引入了空列)。遷移到基於 klib 的雜湊表進行索引;比 Python 的 dict 效能更好,記憶體使用更少。
添加了 first、last、min、max 和 prod 最佳化的 GroupBy 函式。
新的 ordered_merge 函式。
向 DataFrame、Series 添加了靈活的比較例項方法 eq、ne、lt、gt 等。
改進了 scatter_matrix 繪圖函式,並向對角線添加了直方圖或核密度估計。
為密度圖添加了'kde'繪圖選項。
透過 rpy2 支援將 DataFrame 轉換為 R 的 data.frame。
增強了 Series 和 DataFrame 對複數的支援。
向所有資料結構添加了
pct_change方法。為 DataFrame 控制檯輸出添加了 max_colwidth 配置選項。
使用索引值插值 Series 值。
可以從 GroupBy 中選擇多個列。
向 Series/DataFrame 添加了 update 方法,用於就地更新值。
向 DataFrame 添加了
any和all方法。
新的繪圖方法#
import pandas as pd
fx = pd.read_pickle("data/fx_prices")
import matplotlib.pyplot as plt
Series.plot 現在支援 secondary_y 選項。
plt.figure()
fx["FR"].plot(style="g")
fx["IT"].plot(style="k--", secondary_y=True)
2012 年 GSOC 參與者 Vytautas Jancauskas 添加了許多新的繪圖型別。例如,'kde' 是一個新選項。
s = pd.Series(
np.concatenate((np.random.randn(1000), np.random.randn(1000) * 0.5 + 3))
)
plt.figure()
s.hist(density=True, alpha=0.2)
s.plot(kind="kde")
有關更多資訊,請參閱 繪圖頁面。
其他 API 更改#
棄用了時間序列函式中的
offset、time_rule和timeRule引數名。將在 pandas 0.9 或 1.0 之前列印警告。
pandas <= 0.7.3 使用者的潛在移植問題#
pandas 0.8.0 中可能影響您的主要變化是時間序列索引使用 NumPy 的 datetime64 資料型別,而不是 Python 內建 datetime.datetime 物件的 dtype=object 陣列。DateRange 已被 DatetimeIndex 取代,但其他方面行為相同。但是,如果您有將包含 datetime.datetime 值的 DateRange 或 Index 物件轉換為普通 NumPy 陣列的程式碼,那麼由於您將控制權交給了 NumPy,您可能會遇到使用標量值的程式碼中的錯誤。
In [1]: import datetime
In [2]: rng = pd.date_range("1/1/2000", periods=10)
In [3]: rng[5]
Out[3]: Timestamp('2000-01-06 00:00:00')
In [4]: isinstance(rng[5], datetime.datetime)
Out[4]: True
In [5]: rng_asarray = np.asarray(rng)
In [6]: scalar_val = rng_asarray[5]
In [7]: type(scalar_val)
Out[7]: numpy.datetime64
pandas 的 Timestamp 物件是 datetime.datetime 的子類,具有納秒支援(nanosecond 欄位儲存 0 到 999 之間的納秒值)。它應該可以直接替代之前使用 datetime.datetime 值的任何程式碼。因此,我建議不要將 DatetimeIndex 強制轉換為常規 NumPy 陣列。
如果您有需要 datetime.datetime 物件陣列的程式碼,您有幾個選擇。首先,DatetimeIndex 的 astype(object) 方法會生成一個 Timestamp 物件陣列。
In [8]: stamp_array = rng.astype(object)
In [9]: stamp_array
Out[9]:
Index([2000-01-01 00:00:00, 2000-01-02 00:00:00, 2000-01-03 00:00:00,
2000-01-04 00:00:00, 2000-01-05 00:00:00, 2000-01-06 00:00:00,
2000-01-07 00:00:00, 2000-01-08 00:00:00, 2000-01-09 00:00:00,
2000-01-10 00:00:00],
dtype='object')
In [10]: stamp_array[5]
Out[10]: Timestamp('2000-01-06 00:00:00')
要獲取一個真正的 datetime.datetime 物件陣列,請使用 to_pydatetime 方法。
In [11]: dt_array = rng.to_pydatetime()
In [12]: dt_array
Out[12]:
array([datetime.datetime(2000, 1, 1, 0, 0),
datetime.datetime(2000, 1, 2, 0, 0),
datetime.datetime(2000, 1, 3, 0, 0),
datetime.datetime(2000, 1, 4, 0, 0),
datetime.datetime(2000, 1, 5, 0, 0),
datetime.datetime(2000, 1, 6, 0, 0),
datetime.datetime(2000, 1, 7, 0, 0),
datetime.datetime(2000, 1, 8, 0, 0),
datetime.datetime(2000, 1, 9, 0, 0),
datetime.datetime(2000, 1, 10, 0, 0)], dtype=object)
In [13]: dt_array[5]
Out[13]: datetime.datetime(2000, 1, 6, 0, 0)
matplotlib 知道如何處理 datetime.datetime,但不知道如何處理 Timestamp 物件。雖然我建議您使用 TimeSeries.plot 來繪製時間序列,但您可以選擇使用 to_pydatetime 或為 Timestamp 型別註冊一個轉換器。有關更多資訊,請參閱 matplotlib 文件。
警告
NumPy 1.6 的納秒 datetime64 單位存在面向使用者的 API 錯誤。特別是,陣列的字串版本顯示垃圾值,轉換為 dtype=object 同樣是錯誤的。
In [14]: rng = pd.date_range("1/1/2000", periods=10)
In [15]: rng
Out[15]:
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
'2000-01-09', '2000-01-10'],
dtype='datetime64[us]', freq='D')
In [16]: np.asarray(rng)
Out[16]:
array(['2000-01-01T00:00:00.000000', '2000-01-02T00:00:00.000000',
'2000-01-03T00:00:00.000000', '2000-01-04T00:00:00.000000',
'2000-01-05T00:00:00.000000', '2000-01-06T00:00:00.000000',
'2000-01-07T00:00:00.000000', '2000-01-08T00:00:00.000000',
'2000-01-09T00:00:00.000000', '2000-01-10T00:00:00.000000'],
dtype='datetime64[us]')
In [17]: converted = np.asarray(rng, dtype=object)
In [18]: converted[5]
Out[18]: Timestamp('2000-01-06 00:00:00')
**請放心:不要驚慌**。如果您正在使用 NumPy 1.6,並且將您與 datetime64 值的互動限制在 pandas 的 API 中,您將一切安好。資料型別本身(內部為 64 位整數)沒有任何問題;所有重要的資料處理都在 pandas 中進行,並且經過了大量的測試。我強烈建議您**不要直接在 NumPy 1.6 中操作 datetime64 陣列**,而只使用 pandas API。
**支援非唯一索引**:在後一種情況下,您可能有一些在 try:... catch: 塊中的程式碼會因索引不唯一而失敗。在許多情況下,它將不再失敗(某些方法如 append 仍然會檢查唯一性,除非被停用)。但是,並非所有希望都破滅:您可以檢查 index.is_unique,如果為 False,則顯式丟擲異常,或轉到另一個程式碼分支。
貢獻者#
共有 27 人為本次釋出貢獻了補丁。名字旁邊有“+”號的人是第一次貢獻補丁。
Adam Klein
Chang She
David Zaslavsky +
Eric Chlebek +
Jacques Kvam
Kamil Kisiel
Kelsey Jordahl +
Kieran O’Mahony +
Lorenzo Bolla +
Luca Beltrame
Marc Abramowitz +
Mark Wiebe +
Paddy Mullen +
Peng Yu +
Roy Hyunjin Han +
RuiDC +
Senthil Palanisami +
Skipper Seabold
Stefan van der Walt +
Takafumi Arakaki +
Thomas Kluyver
Vytautas Jancauskas +
Wes McKinney
Wouter Overmeire
Yaroslav Halchenko
thuske +
timmie +