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)

有没有更“熊猫惯用”的方式来做到这一点?我尝试了该.rename方法,但出现断言错误:

df.rename(lambda x : x.time())

我真正想要的是做一些类似于箱线图的事情:

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

但没有标准偏差框(将由估计的置信带代替)。有没有办法用一个简单的 pandas 命令来做到这一点?


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

4

3 回答 3

1

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

df.plot()
df.plot(kind='bar')
...

这种方法为您提供了很大的灵活性(具有 matplotlib 的所有功能)。
文档的可视化部分介绍了很多细节,并提供了大量示例。


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

df.index.time  # equivalent to df.index.map(lambda ts: ts.time())

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

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

但是,如果有的话,这似乎只比您的解决方案好一点。也许时间序列索引应该提供一种时间方法,类似于每小时的方式(我隐约记得一个类似的问题......):

plot(df.index.hour, df.value))
于 2013-03-26T15:00:22.337 回答
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。

于 2013-04-17T19:03:09.610 回答
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")

在此处输入图像描述

绘制时间值:

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

在此处输入图像描述

于 2013-03-27T02:50:49.930 回答