版本 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 類。

  • 新的 PeriodIndexPeriod 類,用於表示時間跨度和執行**日曆邏輯**,包括12 財年 季度 頻率 <timeseries.quarterly>。這是對 scikits.timeseries 程式碼庫元素的區域性移植和實質性增強。支援 PeriodIndex 和 DatetimeIndex 之間的轉換。

  • 新的 Timestamp 資料型別繼承自 datetime.datetime,提供相同的介面,同時支援納秒解析度資料。還提供便捷的時區轉換

  • 增強了對時區的支援。向 TimeSeries 和 DataFrame 添加了 tz_converttz_localize 方法。所有時間戳都以 UTC 儲存;來自設定了時區的 DatetimeIndex 物件的 Timsestamp 將被本地化為本地時間。因此,時區轉換幾乎是免費的。使用者現在只需要瞭解很少的 pytz 庫;只需要時區名稱作為字串。時區感應的時間戳僅在它們的 UTC 時間戳匹配時才相等。具有不同時區的時間序列之間的操作將導致一個 UTC 索引的時間序列。

  • 時間序列**字串索引的便捷性** / 快捷方式:按年份、年和月切片,以及使用字串索引值。

  • 增強的時間序列**繪圖**;移植了 scikits.timeseries 基於 matplotlib 的繪圖程式碼。

  • 新的 date_rangebdate_rangeperiod_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 進行前移/後移。

其他新功能#

  • 新的 cutqcut 函式(類似於 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 添加了 anyall 方法。

新的繪圖方法#

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 更改#

  • 棄用了時間序列函式中的 offsettime_ruletimeRule 引數名。將在 pandas 0.9 或 1.0 之前列印警告。

pandas <= 0.7.3 使用者的潛在移植問題#

pandas 0.8.0 中可能影響您的主要變化是時間序列索引使用 NumPy 的 datetime64 資料型別,而不是 Python 內建 datetime.datetime 物件的 dtype=object 陣列。DateRange 已被 DatetimeIndex 取代,但其他方面行為相同。但是,如果您有將包含 datetime.datetime 值的 DateRangeIndex 物件轉換為普通 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 物件陣列的程式碼,您有幾個選擇。首先,DatetimeIndexastype(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 +