在pandas中不同日期的行之间进行计算

时间:2015-11-06 20:55:54

标签: python pandas

我有python的经验,但我是大熊猫的新手,经过一整天努力做到这一点我无法解决它,我尝试了很多不同的方法,但任何人都为我工作。 我有一个这样的数据库:

    open    low   high  close  volume  interest                                                           
2008-08-05 10:00:00  22.53  22.12  22.53  22.14     186       186
2008-08-05 11:00:00  22.20  22.05  22.11  22.10     584       398
2008-08-05 12:00:00  22.19  22.04  22.08  22.15     848       264
2008-08-05 13:00:00  22.20  22.06  22.13  22.13     928        80
2008-08-05 14:00:00  22.19  22.03  22.13  22.08     988        60
2008-08-05 15:00:00  22.37  21.72  22.20  21.77    1418       430
2008-08-05 16:00:00  21.80  21.47  21.77  21.47    1666       248
2008-08-05 17:00:00  21.50  21.37  21.43  21.40    1865       199
.....

我试图在index.hour == 17的close列和index.hour == 6的close列之间进行减法,每天。

如果我尝试这样的话:

df[df.index.hour==17].close.sub(df[df.index.hour==6].open)

结果是NaN,如果我尝试制作一个新的DataFrame,结果也是Nan。 我怎么能这样做?也许我不太了解大熊猫,并没有那么容易做到这一点,我需要制作一个完整的脚本?感谢

2 个答案:

答案 0 :(得分:1)

这可能不是最优雅的方式,但让我们看看:

In [54]:
#changed your first observation to 6:00
print df

                      open    low   high  close  volume  interest
2008-08-05 06:00:00  22.53  22.12  22.53  22.14     186       186
2008-08-05 11:00:00  22.20  22.05  22.11  22.10     584       398
2008-08-05 12:00:00  22.19  22.04  22.08  22.15     848       264
2008-08-05 13:00:00  22.20  22.06  22.13  22.13     928        80
2008-08-05 14:00:00  22.19  22.03  22.13  22.08     988        60
2008-08-05 15:00:00  22.37  21.72  22.20  21.77    1418       430
2008-08-05 16:00:00  21.80  21.47  21.77  21.47    1666       248
2008-08-05 17:00:00  21.50  21.37  21.43  21.40    1865       199

In [55]:

df[np.in1d(df.index.hour, [6, 17])].groupby(pd.TimeGrouper(freq='24h')).close.agg(lambda x: x[-1]-x[0])

Out[55]:

2008-08-05    0.74
Freq: 24H, Name: close, dtype: float64

这个想法是首先对数据帧进行切片,使其仅包含6和17 o时钟数据。然后我们分组一天,并计算每天17到6点钟收盘价 FOR 之间的差异。

如果您对最后一次收盘和第一次开盘之间的差异感兴趣:

In [96]:

grp = df.ix[np.in1d(df.index.hour, [6, 17]),

            ['open','close']].groupby(pd.TimeGrouper(freq='24h'))

grp.close.last()-grp.open.last()

Out[96]:

2008-08-05   -0.1
Freq: 24H, dtype: float64

答案 1 :(得分:1)

如果你的数据帧定义得很好(你不需要检查每天是否包含6点和17点的数据)你可以使用pandas.DataFrame.diff并查询:

    >>> df['hour'] = df.index.hour
    >>> df.query('hour == 6 | hour == 17').diff()

                     open   low  high  close  volume  interest  hour
datetime                                                            
2008-08-05 06:00:00   NaN   NaN   NaN    NaN     NaN       NaN   NaN
2008-08-05 17:00:00 -1.03 -0.75  -1.1  -0.74    1679        13    11
     >>> df.query('hour == 6 | hour == 17').diff(-1)

                     open   low  high  close  volume  interest  hour
datetime                                                            
2008-08-05 06:00:00  1.03  0.75   1.1   0.74   -1679       -13   -11
2008-08-05 17:00:00   NaN   NaN   NaN    NaN     NaN       NaN   NaN