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

这是 0.7.3 的主要版本,包括时间序列处理和处理基础设施方面的大量工作,以及整个库的大量新功能。它包括来自 20 多名不同作者的 700 多项提交。大多数 pandas 0.7.3 及更早版本的用户在升级时不会遇到任何问题,但由于迁移到 NumPy datetime64 dtype,可能存在许多潜在的错误和不兼容性。如有必要,将在 0.8.1 版本中尽快修复挥之不go的不兼容性。请参阅GitHub 上的完整发行说明或问题跟踪器以获取完整列表。

支持非唯一索引#

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

NumPy datetime64 dtype 和 1.6 依赖项#

时间序列数据现在使用 NumPy 的 datetime64 dtype 表示;因此,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 timeseries API 的概述,请参阅文档。

  • 与 datetime.datetime相比,新的 datetime64 表示法加速了连接操作和数据对齐减少了内存使用,并显着提高了序列化/反序列化性能。

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

  • 改进频率别名并支持 频率快捷方式,例如“15min”或“1h30min”

  • 新的DatetimeIndex 类支持固定频率和不规则时间序列。替换现已弃用的 DateRange 类

  • 用于表示 时间跨度和执行日历逻辑的PeriodIndex和类,包括.这是 scikits.timeseries 代码库元素的部分移植和实质性增强。支持PeriodIndex和DatetimeIndex之间的转换Period12 fiscal quarterly frequencies <timeseries.quarterly>

  • 新的时间戳数据类型子类datetime.datetime,提供相同的接口,同时支持处理纳秒分辨率的数据。还提供简单的时区转换

  • 增强了对时区的支持。向 TimeSeries 和 DataFrame添加 tz_convert和方法。tz_localize所有时间戳均存储为 UTC;设置了时区的 DatetimeIndex 对象的时间戳将本地化为本地时间。因此,时区转换基本上是免费的。用户现在需要对 pytz 库知之甚少;仅需要字符串形式的时区名称。当且仅当它们的 UTC 时间戳匹配时,时区感知时间戳才相等。具有不同时区的时区感知时间序列之间的操作将产生 UTC 索引的时间序列。

  • 时间序列字符串索引便利/快捷方式:切片年、年和月以及带字符串的索引值

  • 增强的时间序列绘图;改编 scikits.timeseries 基于 matplotlib 的绘图代码

  • date_rangebdate_range、 和period_range 工厂功能

  • 强大的频率推断函数infer_freqinferred_freq DatetimeIndex 属性,可以选择在构造 DatetimeIndex 时推断频率

  • to_datetime 函数有效地将字符串数组解析为 DatetimeIndex。 DatetimeIndex 将解析数组或字符串列表为 datetime64

  • 优化了对 Series 和 DataFrame 列中 datetime64-dtype 数据的支持

  • 新的 NaT(Not-a-Time)类型用于表示时间戳数组中的NA

  • 优化 Series.asof 以查找时间戳数组的“截至”值

  • 毫米、微米、纳米日期偏移物体

  • 可以使用 datetime.time 对象对时间序列进行索引,以选择一天中特定时间( TimeSeries.at_time) 或两个时间 ( TimeSeries.between_time)之间的所有数据

  • 使用索引的频率(如果有)添加超前/滞后的tshift方法,而不是使用平移的简单超前/滞后

其他新功能#

  • 新的剪切和函数(如 R 的剪切函数),用于通过将值分箱到基于值 ( ) 或基于分位数 ( ) 的箱qcut中,从连续变量计算分类变量cutqcut

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

  • 将limit参数添加到 fillna/reindex

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

  • 添加灵活的替换方法以高效替换值

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

  • 向解析器函数添加注释选项:read_csv 等。

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

  • 允许用户指定 CSV 阅读器方言来控制引用等。

  • 处理read_csv 中的数千个分隔符以改进整数解析。

  • 能够一次性解除多个级别的堆叠。减少pivot_table 错误(引入空列)

  • 转向基于 klib 的哈希表进行索引;比 Python 的 dict 有更好的性能和更少的内存使用

  • 添加第一个、最后一个、最小、最大和产品优化的 GroupBy 函数

  • 新的ordered_merge函数

  • 为DataFrame、Series添加灵活的比较实例方法eq、ne、lt、gt等

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

  • 为密度图添加“kde”绘图选项

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

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

  • pct_change向所有数据结构添加方法

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

  • 使用索引值插值系列

  • 可以从 GroupBy 中选择多列

  • 向 Series/DataFrame添加更新方法以就地更新值

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

  • 弃用时间序列函数中的offsettime_rule和参数名称。timeRule警告将在 pandas 0.9 或 1.0 之前打印。

pandas <= 0.7.3 用户的潜在移植问题#

pandas 0.8.0 中可能影响您的主要变化是时间序列索引使用 NumPy 的datetime64数据类型而不是dtype=objectPython 内置datetime.datetime对象的数组。DateRange已被替换,DatetimeIndex但在其他方面表现相同。但是,如果您有将值转换为普通 NumPy 数组的代码DateRangeIndex用于包含 datetime.datetime值的对象,则使用标量值的代码可能潜伏着错误,因为您将控制权移交给了 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的子类(该字段存储 0 到 999 之间的纳秒值)。它应该直接替换为之前使用过值的任何代码 。因此,我建议不要转换 为常规 NumPy 数组。datetime.datetimenanoseconddatetime.datetimeDatetimeIndex

如果您的代码需要对象数组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')

要获取正确对象的数组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 中面向用户的 API 中存在纳秒 datetime64 单位的错误。特别是,数组的字符串版本显示垃圾值,并且转换为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')

相信我:不要惊慌。如果您使用 NumPy 1.6 并将与datetime64值的交互限制为 pandas 的 API,那就没问题了。数据类型没有问题(内部是 64 位整数);所有重要的数据处理都在 pandas 中进行,并且经过严格测试。我强烈建议您不要直接在 NumPy 1.6 中使用 datetime64 数组,而仅使用 pandas API。

支持非唯一索引:在后一种情况下,块内的代码可能由于索引不唯一而失败。在许多情况下,它不会再失败(某些方法,例如仍然检查唯一性,除非禁用)。但是,一切并没有丢失:您可以显式检查并引发异常(如果有) 或转到不同的代码分支。try:... catch:appendindex.is_uniqueFalse

贡献者#

共有 27 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。

  • 亚当·克莱因

  • 常社

  • 大卫·扎斯拉夫斯基 +

  • 埃里克·切勒贝克 +

  • 雅克·科瓦姆

  • 卡米尔·基西尔

  • 凯尔西·乔达尔 +

  • 基兰·奥马霍尼 +

  • 洛伦佐·博拉 +

  • 卢卡·贝尔特拉姆

  • 马克·阿布拉莫维茨 +

  • 马克·韦伯 +

  • 帕迪·马伦 +

  • 彭宇+

  • 韩罗伊·贤振 +

  • 睿DC+

  • 森西尔·帕拉尼萨米 +

  • 船长西博尔德

  • 斯特凡·范德沃尔特 +

  • 新垣隆文 +

  • 托马斯·克鲁弗

  • 维陶塔斯·扬考斯卡斯 +

  • 韦斯·麦金尼

  • 沃特·奥弗迈尔

  • 雅罗斯拉夫·哈尔琴科

  • 苏斯克+

  • 蒂米+