映射pandas DataFrame索引

3
假设我有一个由datetime索引的数据框:
> df.head()

                        value
2013-01-01 00:00:00 -0.014844
2013-01-01 01:00:00  0.243548
2013-01-01 02:00:00  0.463755
2013-01-01 03:00:00  0.695867
2013-01-01 04:00:00  0.845290
(...)

如果我想按日期绘制所有值,可以这样做:
times = map(lambda x : x.date(), df.index)
values = df.value
plot(values, times)

有没有更符合“pandas习惯”的方法?我尝试使用.rename方法,但是出现了断言错误:
df.rename(lambda x : x.time())

我真正想做的是类似于箱线图的东西:


df.boxplot(by = lambda x : x.time())

但是没有标准差框(将被估计置信区间替代)。有没有一种用简单的pandas命令来实现这个的方法?


我不知道我是否清楚了问题所在。问题是,我有一个datetime字段作为数据帧的索引,并且我需要提取时间部分并按时间绘制值。这将给我很多具有相同x轴的点,这很好,但是rename方法似乎希望结果索引中的每个值都是唯一的。


你重命名得到断言是因为你不能有两个具有相同值的索引,而悲剧是你的所有示例中的索引都在同一天。 - waitingkuo
3个回答

1
如果您需要时间值,那么这非常快速。
def dt_time(ind):
  return np.array([time(*time_tuple) for time_tuple in zip(ind.hour, ind.minute, ind.second)])

调用 map 将会慢得多。
In [29]: %timeit dt_time(dt)
1000 loops, best of 3: 511 µs per loop

In [30]: %timeit dt_map(dt)
10 loops, best of 3: 96.3 ms per loop

对于长度为100的DatetimeIndex。


1
您可以使用DataFrame plot方法进行本地绘图,例如:
df.plot()
df.plot(kind='bar')
...

这种方法给你很大的灵活性(拥有matplotlib的全部功能)。文档中的可视化部分详细介绍了此方法,并提供了丰富的示例。
在0.12+版本中,DatetimeIndex上有一个time方法/属性(如果我没记错是由于这个问题):
df.index.time  # equivalent to df.index.map(lambda ts: ts.time())

要仅绘制时间,您可以使用:

plot(df.index.time, df.value)

然而,这似乎只比你的解决方案略好,如果有的话。也许时间序列索引应该提供一个时间方法,类似于它为小时提供的方法(我模糊地记得有一个类似的问题...):
plot(df.index.hour, df.value))

但是我该如何转换索引以仅从日期时间中提取时间? - Rafael S. Calsaverini
嗯,plot(df.index.map(lambda ts: ts.time()), df.value) 稍微好一些,但仍然不太令人满意。也许时间序列索引应该提供一个时间方法(就像它为小时提供的那样,即 plot(df.index.hour, df.value))。 - Andy Hayden

1

这是我的解决方案:

创建数据:

import pandas as pd
from pandas import *
from numpy.random import randn
rng = date_range('1/1/2011', periods=72, freq='H')
ts = TimeSeries(randn(72), index=rng)

绘制日期-值图:

ts.to_period("D").plot(style="o")

enter image description here

绘制时间-数值图:

TimeSeries(ts.values, index=DatetimeIndex(ts.index.values - 
    ts.index.to_period("D").to_timestamp().values)).plot(style="o")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接