Python 映射数据帧索引

Python 映射数据帧索引,python,datetime,pandas,Python,Datetime,Pandas,假设我有一个按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

假设我有一个按
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)
有没有更“地道”的方法?我尝试了
.rename
方法,但出现了断言错误:

df.rename(lambda x : x.time())
我真正想要的是做一些类似于箱线图的事情:

df.boxplot(by = lambda x : x.time())
但没有标准偏差框(将由估计置信带代替)。有没有一种方法可以通过一个简单的命令来实现这一点



我不知道我是否清楚问题出在哪里。问题是我有一个datetime字段作为数据帧的索引,我只需要提取时间部分并按时间绘制值。这将为我提供许多具有相同x轴的点,这很好,但是
重命名
方法似乎期望结果索引中的每个值都是唯一的。

您可以使用DataFrame方法进行本机绘图,例如:

df.plot()
df.plot(kind='bar')
...
此方法提供了很大的灵活性(利用matplotlib的所有功能)。
文档的内容非常详细,并有大量的示例


在0.12+中,DatetimeIndex上有一个time方法/属性(由于这个问题,IIRC):

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

plot(df.index.time, df.value)
然而,这似乎只比您的解决方案稍微好一点,如果有的话。也许timeseries索引应该提供一种时间方法,类似于它对小时的处理方式(我隐约记得一个类似的问题…):

以下是我的解决方案:

将数据装箱:

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")

绘图时间值:

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

如果需要时间值,那么这相当快

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

但是如何转换索引以仅从日期时间中提取时间呢?Hmmm
plot(df.index.map(lambda ts:ts.time()),df.value)
稍好一些,但仍然不令人满意。也许timeseries索引应该提供一个时间方法(就像它对小时所做的那样,即
绘图(df.index.hour,df.value)
)。重命名got断言是因为不能有两个具有相同值的索引,而悲剧的是,示例中的所有索引都在同一天。
def dt_time(ind):
  return np.array([time(*time_tuple) for time_tuple in zip(ind.hour, ind.minute, ind.second)])
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