熊猫时间序列和groupby

时间:2013-12-10 22:18:20

标签: python group-by pandas

[更清楚地编辑根状态问题,如果你使用numpy 1.8作为dmvianna指出,其行为会有所不同]

我有一个DataFrame,它有时间戳添加其他数据。最后,我不想使用格式化的时间作为索引,因为它与matplotlibs 3d绘图混淆。我还想预先形成一个groupby来填充一些标志字段。这导致我遇到一些奇怪的错误。前两个工作正如我所料。一旦我将pd.to_datetime带入图片,它就会开始抛出错误。

按预期运行:

import pandas as pd
import numpy as np

df = pd.DataFrame({'time':np.random.randint(100000, size=1000),
                    'type':np.random.randint(10, size=1000), 
                    'value':np.random.rand(1000)})

df['high'] = 0

def high_low(group):
    if group.value.mean() > .5:
        group.high = 1
    return group

grouped = df.groupby('type')
df = grouped.apply(high_low)

工作正常:

df = pd.DataFrame({'time':np.random.randint(100000, size=1000),
                    'type':np.random.randint(10, size=1000), 
                    'value':np.random.rand(1000)})

df.time = pd.to_datetime(df.time, unit='s')

df['high'] = 0

def high_low(group):
    if group.value.mean() > .5:
        group.high = 1
    return group

grouped = df.groupby('type')
df = grouped.apply(high_low)

抛出错误: ValueError: Shape of passed values is (3, 1016), indices imply (3, 1000)

df = pd.DataFrame({'time':np.random.randint(100000, size=1000),
                    'type':np.random.randint(10, size=1000), 
                    'value':np.random.rand(1000)})

df.time = pd.to_datetime(df.time, unit='s')
df = df.set_index('time')

df['high'] = 0

def high_low(group):
    if group.value.mean() > .5:
        group.high = 1
    return group

grouped = df.groupby('type')
df = grouped.apply(high_low)

抛出错误: ValueError: Shape of passed values is (3, 1016), indices imply (3, 1000)

df = pd.DataFrame({'time':np.random.randint(100000, size=1000),
                    'type':np.random.randint(10, size=1000), 
                    'value':np.random.rand(1000)})

df['epoch'] = df.time
df.time = pd.to_datetime(df.time, unit='s')
df = df.set_index('time')
df = df.set_index('epoch')

df['high'] = 0

def high_low(group):
    if group.value.mean() > .5:
        group.high = 1
    return group

grouped = df.groupby('type')
df = grouped.apply(high_low)

任何人都知道我错过了什么/做错了吗?

1 个答案:

答案 0 :(得分:2)

我会使用pd.to_datetime而不是np.datetime64。它将在列中工作,并提供与datetime.index相同的功能(np.datetime64是datetime.index的构建块)。

import numpy as np
data['time2'] = np.datetime64(data.time, 's')

检查Docs

这也会导致相同的结果:

import pandas as pd
data['time2'] = pd.to_datetime(data.time, unit='s')

请注意,我使用的是pandas 0.12.0和Numpy 1.8.0。 Numpy 1.7有下面评论中提到的问题。