版本 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_range、bdate_range、 和period_range 工厂功能 强大的频率推断函数infer_freq和inferred_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 重命名Factor并Categorical添加许多可用性功能 将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 更改# 弃用时间序列函数中的offset、time_rule和参数名称。timeRule警告将在 pandas 0.9 或 1.0 之前打印。 pandas <= 0.7.3 用户的潜在移植问题# pandas 0.8.0 中可能影响您的主要变化是时间序列索引使用 NumPy 的datetime64数据类型而不是dtype=objectPython 内置datetime.datetime对象的数组。DateRange已被替换,DatetimeIndex但在其他方面表现相同。但是,如果您有将值转换为普通 NumPy 数组的代码DateRange或Index用于包含 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+ 森西尔·帕拉尼萨米 + 船长西博尔德 斯特凡·范德沃尔特 + 新垣隆文 + 托马斯·克鲁弗 维陶塔斯·扬考斯卡斯 + 韦斯·麦金尼 沃特·奥弗迈尔 雅罗斯拉夫·哈尔琴科 苏斯克+ 蒂米+