版本 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之间的转换Period
12 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
中,从连续变量计算分类变量cut
qcut
重命名
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=object
Python 内置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.datetime
nanosecond
datetime.datetime
DatetimeIndex
如果您的代码需要对象数组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:
append
index.is_unique
False
贡献者#
共有 27 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。
亚当·克莱因
常社
大卫·扎斯拉夫斯基 +
埃里克·切勒贝克 +
雅克·科瓦姆
卡米尔·基西尔
凯尔西·乔达尔 +
基兰·奥马霍尼 +
洛伦佐·博拉 +
卢卡·贝尔特拉姆
马克·阿布拉莫维茨 +
马克·韦伯 +
帕迪·马伦 +
彭宇+
韩罗伊·贤振 +
睿DC+
森西尔·帕拉尼萨米 +
船长西博尔德
斯特凡·范德沃尔特 +
新垣隆文 +
托马斯·克鲁弗
维陶塔斯·扬考斯卡斯 +
韦斯·麦金尼
沃特·奥弗迈尔
雅罗斯拉夫·哈尔琴科
苏斯克+
蒂米+