版本0.8.0(2012年6月29日)#

这是从0.7.3发布的一个重要版本,包括在时间序列处理和处理基础设施方面的大量工作,以及整个库中的大量新功能。它包括来自20多个不同作者的700多篇文章。大多数Pandas0.7.3和更早版本的用户应该不会遇到任何升级问题,但由于迁移到NumPy日期时间64 dtype,可能会有一些错误和不兼容潜伏。如果需要,挥之不去的不兼容性将在0.8.1版本中尽快修复。请参阅 full release notes 或在GitHub上的问题跟踪器上查看完整的列表。

支持非唯一索引#

所有对象现在都可以使用非唯一索引。数据对齐/联接操作根据SQL联接语义工作(如果适用,包括多对多联接中的索引复制)

NumPy日期时间64 dtype和1.6依赖项#

时间序列数据现在使用NumPy的DateTime64dtype表示;因此,Pandas0.8.0现在至少需要NumPy 1.6。它已经过测试和验证,可以与NumPy的开发版本(1.7+)一起使用,该版本包括一些重要的面向用户的API更改。NumPy 1.6还有许多与纳秒分辨率数据有关的错误,所以我建议您避免使用NumPy 1.6的DateTime64 API函数(尽管它们有一定的局限性),只使用Pandas提供的接口与此数据交互。

有关将遗留代码库从Pandas 0.7或更早版本迁移到0.8.0的用户的潜在问题,请参阅0.8.0部分的“移植”指南。

对于旧版NumPy<1.6的用户,0.7.x系列的错误修复将在出现错误时提供。除了错误修复外,0.7.x中将不会有更多的开发。

时间序列的变化和改进#

备注

在这个版本中,遗留的SCRKIT.TimeSeries用户应该能够移植他们的代码来使用Pandas。

备注

看见 documentation 有关PandasTimeSeries API的概述。

  • 新的DateTime64表示 加快连接操作和数据对齐减少内存使用量 ,并显著提高序列化/反序列化性能。

  • 高性能和灵活性 重采样 从高到低和从低到高频率转换的方法。支持内插、用户定义的聚合函数,以及对如何定义间隔和结果标签的控制。还实现了一套高性能的基于Cython/C的重采样函数(包括Open-High-Low-Close)。

  • 技术改造 frequency aliases 和支持 频率捷径 如“15分钟”或“1小时30分钟”

  • 新的 DatetimeIndex class 支持固定频率和不规则时间序列。取代现在不推荐使用的DateRange类

  • 新的 PeriodIndexPeriod 类,用于表示 time spans 和表演 日历逻辑 ,包括 12 fiscal quarterly frequencies <timeseries.quarterly> 。这是对SCHICKITS的元素的部分移植,并且是对这些元素的实质性增强。支持周期索引和日期索引之间的转换

  • 新的时间戳数据类型子类 datetime.datetime ,提供相同的界面,同时允许处理纳秒分辨率的数据。还提供了 easy time zone conversions

  • 增强了对 time zones 。增列 tz_converttz_localize 方法设置为TimeSeries和DataFrame。所有时间戳都存储为UTC;来自设置了时区的DatetimeIndex对象的时间戳将本地化为本地时间。因此,时区转换基本上是免费的。用户现在只需要知道很少的关于PYTZ库的知识;只需要将时区名称作为字符串。当且仅当它们的UTC时间戳匹配时,时区感知时间戳才相等。在具有不同时区的时区感知时间序列之间进行运算将产生UTC索引的时间序列。

  • 时间序列 字符串索引的方便性 /快捷方式:用字符串分割年、年、月和索引值

  • 增强的时间序列 标绘 基于时间序列matplotlib的绘图代码

  • 新的 date_rangebdate_range ,以及 period_range factory functions

  • 鲁棒性 频率推断 功能 infer_freqinferred_freq DatetimeIndex的属性,具有在构造DatetimeIndex时推断频率的选项

  • 高效的To_DateTime函数 解析字符串数组 设置为DatetimeIndex。DatetimeIndex将字符串数组或列表解析为DateTime64

  • 已优化 支持Series和DataFrame列中的DateTime64-dtype数据

  • 要表示的新NAT(非一次性)类型 NA 在时间戳数组中

  • 优化Series.asof进行查找 “截止日期”值 对于时间戳数组

  • 毫秒、微米、纳米日期偏移对象

  • Can index time series with datetime.time objects to select all data at particular time of day (TimeSeries.at_time) or between two times (TimeSeries.between_time)

  • 添加 tshift 使用索引的频率(如果有)领先/滞后的方法,而不是使用Shift的朴素领先/滞后

其他新功能#

  • 新的 cutqcut 用于从连续变量计算类别变量的函数(如R的截断函数),方法是将值放入基于值的 (cut )或基于分位数 (qcut )垃圾箱

  • 重命名 FactorCategorical 并添加了许多可用性功能

  • 添加 limit 填充NA/reindex的参数

  • GroupBy中更灵活的多功能应用,可以传递列表(名称,函数)元组,以给定的名称按特定顺序获得结果

  • 增加灵活性 replace 一种高效代换数值的方法

  • 增强型 read_csv/read_table 用于读取时间序列数据并将多列转换为日期

  • 添加 comments 解析器函数的选项:READ_CSV等。

  • 添加 dayfirst 用于解析国际DD/MM/YYYY日期的解析函数的选项

  • 允许用户指定CSV读卡器 dialect 控制报价等。

  • 装卸 thousands READ_CSV中的分隔符,以改进整数解析。

  • 在一次拍摄中实现多个级别的出栈。缓解 pivot_table 错误(正在引入空列)

  • 转而使用基于klib的哈希表进行索引;与Python的dict相比,性能更好,内存使用量更少

  • 添加First、Last、Min、Max和Prod优化的GroupBy函数

  • 新的 ordered_merge 功能

  • 增加灵活性 comparison 实例方法eq、ne、lt、gt等到DataFrame,Series

  • 改进 scatter_matrix 绘制函数并将直方图或核密度估计值添加到对角线

  • 添加 'kde' 密度打印的打印选项

  • 支持通过rpy2将DataFrame转换为R data.Frame

  • 改进了对Series和DataFrame中复数的支持

  • 添加 pct_change 方法应用于所有数据结构

  • 为DataFrame控制台输出添加max_colidth配置选项

  • Interpolate 使用索引值的序列值

  • 可以从GroupBy中选择多列

  • 添加 update 用于就地更新值的Series/DataFrame方法

  • 添加 anyall 方法设置为DataFrame

新的标绘方法#

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 Jancoskas增加了许多新的情节类型。例如, '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")

看见 the plotting page 想要更多。

其他API更改#

  • 不推荐使用 offsettime_rule ,以及 timeRule 时间序列函数中的参数名称。警告将打印到Pandas0.9或1.0。

大Pandas0.7.3以下用户的潜在移植问题#

在Pandas 0.8.0中,可能影响您的主要变化是时间序列指数使用NumPy datetime64 数据类型而不是 dtype=object Python的内置数组 datetime.datetime 对象。 DateRange 已被替换为 DatetimeIndex 但在其他方面表现都是一样的。但是,如果您的代码可以将 DateRangeIndex 对象,这些对象过去包含 datetime.datetime 值转换为普通的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', freq='D')

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 对象,您有几个选择。首先, astype(object) 一种方法 DatetimeIndex 生成一个数组,其中 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', freq='D')

获取一组适当的 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 but not Timestamp objects. While I recommend that you plot time series using TimeSeries.plot, you can either use to_pydatetime or register a converter for the Timestamp type. See matplotlib documentation 了解更多有关这方面的信息。

警告

NumPy 1.6中的纳秒日期时间64单元的面向用户的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[ns]', freq='D')

In [16]: np.asarray(rng)
Out[16]: 
array(['2000-01-01T00:00:00.000000000', '2000-01-02T00:00:00.000000000',
       '2000-01-03T00:00:00.000000000', '2000-01-04T00:00:00.000000000',
       '2000-01-05T00:00:00.000000000', '2000-01-06T00:00:00.000000000',
       '2000-01-07T00:00:00.000000000', '2000-01-08T00:00:00.000000000',
       '2000-01-09T00:00:00.000000000', '2000-01-10T00:00:00.000000000'],
      dtype='datetime64[ns]')

In [17]: converted = np.asarray(rng, dtype=object)

In [18]: converted[5]
Out[18]: Timestamp('2000-01-06 00:00:00', freq='D')

相信我:不要惊慌 。如果您使用的是NumPy 1.6并限制与 datetime64 对Pandas的API的价值你会很好的。数据类型(内部为64位整数)没有问题;所有重要的数据处理都发生在Pandas身上,并且经过了严格的测试。我强烈建议你 不要直接使用NumPy 1.6中的DateTime64数组 并且只使用PandasAPI。

Support for non-unique indexes :在后一种情况下,您可能在 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 +