版本 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 的重采样函数(包括开盘价-最高价-最低价-收盘价)。重新设计了频率别名,并支持像“15min”或“1h30min”这样的频率快捷方式
新的DatetimeIndex 类支持固定频率和不规则时间序列。取代了现在已弃用的
DateRange
类新的
PeriodIndex
和Period
类用于表示时间跨度和执行日历逻辑,包括12 个财政季度频率 <timeseries.quarterly>
。这是 scikits.timeseries 代码库的元素的部分移植和重大增强。支持PeriodIndex
和DatetimeIndex
之间的转换。新的
Timestamp
数据类型继承自datetime.datetime
,提供了相同的接口,同时支持处理纳秒分辨率数据。还提供了简便的时区转换。增强的时区支持。为
TimeSeries
和DataFrame
添加了tz_convert
和tz_localize
方法。所有时间戳都存储为 UTC;设置了时区的DatetimeIndex
对象中的时间戳将被本地化为当地时间。因此,时区转换基本上是免费的。用户现在几乎不需要了解 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
,用于查找时间戳数组的“截至”值毫秒、微秒、纳秒日期偏移对象
可以使用
datetime.time
对象索引时间序列,以选择一天中特定时间(TimeSeries.at_time
)或两个时间之间(TimeSeries.between_time
)的所有数据。添加 tshift 方法,用于根据索引的频率(如果有)进行超前/滞后,而不是使用
shift
进行简单的超前/滞后
其他新功能#
新的cut 和
qcut
函数(类似于 R 语言的 cut 函数),用于通过将值分箱为基于值(cut
)或基于分位数(qcut
)的箱,从连续变量计算分类变量。将
Factor
重命名为Categorical
并添加了多项可用性功能为 fillna/reindex 添加 limit 参数
GroupBy
中更灵活地应用多个函数,并且可以传递(name, function)
元组列表以按给定名称的特定顺序获取结果添加灵活的replace 方法以高效地替换值
增强了read_csv/read_table,用于读取时间序列数据并将多列转换为日期
为解析函数(如
read_csv
等)添加 comments 选项为解析函数添加 dayfirst 选项,用于解析国际化的 DD/MM/YYYY 日期
允许用户指定 CSV 读取器方言以控制引用等
在
read_csv
中处理千位分隔符以改进整数解析。允许一次性取消堆叠多个级别。解决了
pivot_table
的一些错误(例如引入空列)迁移到基于 klib 的哈希表进行索引;比 Python 的字典性能更好,内存使用更少
添加了
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 中,面向用户的 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 范围内,那么您将一切顺利。NumPy 内部的数据类型(一个 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 +