pandas TimeSeries diff()恢复为Series

时间:2014-07-06 15:31:26

标签: python pandas

我正在使用以下格式的一些TimeSeries数据:

  

1984-12-12 14:08:00
  1984-12-12 14:25:00
  1984-12-12 14:47:00
  1984-12-12 16:37:00
  1984-12-12 16:37:00
  1984-12-12 16:37:00
  1984-12-12 17:52:00
  1984-12-12 17:52:00
  1984-12-12 19:29:00

在过去的几个days!中,似乎只是一些简单的操作(一个愉快的下午),已经变成了ha and和严​​峻。

以下是reqs btw:

  • 获取TimeSeries中某些行之间的差异
  • 生成差异的cumsum。

首先,当我接近大熊猫和整个group-apply-combine范例时,我喜欢做的是

  • 在DataFrame上创建一些组
  • 编写一个带有组对象并返回组对象的函数
  • 使用lamda apply将组传递给函数

我认为这是标准的,我喜欢使用它的原因是组,多列和新列插入的隐式连接。 (它还会删除群组循环,使矢量化变得更容易)...但我认为处理空群体时遇到了麻烦......

无论如何,为了获得TimeSeries的差异,我发现使用shift()来获得时间差异引发StopIteration错误,使用diff(1)没有错误。

但是,新增量列(具有事件的行之间的时差)将变为系列。

time                   ev             delta

1984-12-12 14:08:00        1           NaT  
1984-12-12 14:25:00        1      00:17:00  
1984-12-12 14:47:00        1      00:22:00  
1984-12-12 16:37:00        0      01:50:00  
1984-12-12 16:37:00        1      01:50:00  
1984-12-12 16:37:00        0      01:50:00  
1984-12-12 17:52:00        0      01:15:00  
1984-12-12 17:52:00        1      01:15:00  
1984-12-12 19:29:00        1      01:37:00 

尝试将Series转换为TimeSeries证明是无用的。格式问题引发了一个错误(非常长的数字+ L不是以小时,分钟,秒的形式发现的),这显然会中止整个尝试并尝试抓住它不能通过它。

    try:
        pd.to_datetime(d['delta'], format='%H:%M:%S')
    except:
        pass

另一个不断弹出的错误是获得一个时间总和的StopIteration错误。

gg['cumt'] = pd.rolling_apply( gg['time'], 2, np.sum )
gg['cumt'] = pd.rolling_sum(gg['time'],2).shift(1)
gg['cumt'] = gg.apply(lambda x: pd.expanding_sum(x['time'], min_periods=2) )

我相信这是一个简单的cumsum没有抛出错误gg['cumt'] = gg['tavg'].cumsum(),但是时间格式问题会导致字符串转换为某个int,并将它们相加为微小数字。

任何帮助,一般或具体的表示赞赏:

我喜欢写一个函数并返回一个组的简单想法。我没有过多地研究transform函数(不要以为我可以让它工作);在函数中返回修改后的组不需要转换/广播。这是导致我StopIteration错误的原因吗?我觉得它无法处理某些群体是空的?

1 个答案:

答案 0 :(得分:4)

Pandas 0.12.0,Numpy 1.7.1,Python 2.7.5,Linux Mint

import pandas as pd
import StringIO

data = '''time
1984-12-12 14:08:00
1984-12-12 14:25:00
1984-12-12 14:47:00
1984-12-12 16:37:00
1984-12-12 16:37:00
1984-12-12 16:37:00
1984-12-12 17:52:00
1984-12-12 17:52:00
1984-12-12 19:29:00'''

df = pd.read_csv(StringIO.StringIO(data))

df['time'] = pd.DatetimeIndex(df['time'])

df['delta'] = df['time'].diff()

#df['delta'] = pd.TimeSeries(df['delta']) # sorry, not needed

#df['delta'][0] = 0 # to remove NaT 

# better method to remove NaT - thanks to Jeff
df['delta'] = df['delta'].fillna(0) 

df['cumsum'] = df['delta'].cumsum()

print df

结果

                   time      delta     cumsum
0   1984-12-12 14:08:00   00:00:00   00:00:00
1   1984-12-12 14:25:00   00:17:00   00:17:00
2   1984-12-12 14:47:00   00:22:00   00:39:00
3   1984-12-12 16:37:00   01:50:00   02:29:00
4   1984-12-12 16:37:00   00:00:00   02:29:00
5   1984-12-12 16:37:00   00:00:00   02:29:00
6   1984-12-12 17:52:00   01:15:00   03:44:00
7   1984-12-12 17:52:00   00:00:00   03:44:00
8   1984-12-12 19:29:00   01:37:00   05:21:00