Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫时间序列与群比_Python_Group By_Pandas - Fatal编程技术网

Python 熊猫时间序列与群比

Python 熊猫时间序列与群比,python,group-by,pandas,Python,Group By,Pandas,[编辑以更清楚地说明根本问题,如dmvianna所指出的,如果使用numpy 1.8,其行为会有所不同] 我有一个带有时间戳的数据框,可以添加其他数据。最后,我不想使用格式化的时间作为索引,因为它会干扰matplotlibs 3d打印。我还想预先设置一个groupby来填充一些标志字段。这让我遇到了一些奇怪的错误。前两项工作正如我所期望的那样。一旦我把pd.to_datetime带入图片,它就会开始抛出错误 按预期运行: import pandas as pd import numpy as n

[编辑以更清楚地说明根本问题,如dmvianna所指出的,如果使用numpy 1.8,其行为会有所不同]

我有一个带有时间戳的数据框,可以添加其他数据。最后,我不想使用格式化的时间作为索引,因为它会干扰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:传递的值的形状是(31016),索引意味着(31000)

抛出错误:
ValueError:传递的值的形状是(31016),索引意味着(31000)


有人知道我遗漏了什么/做错了什么吗?

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

检查

这也会导致同样的结果:

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

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

您可能想用示例数据、预期输出和更清晰的问题说明来重写您的问题。您说您的groupby失败了,在这之后我调用了什么groupby:
data.groupby(['source','DoY'))
,这消除了我给出的错误。我将进行编辑以澄清。@TristanMatthews我不明白dmvianna的回答是如何解决这个问题的。@Yhayden回答了我的问题,即如何将我想要的数据添加到数据框中,而不复制数据,也不可能扰乱顺序。我仍然不知道为什么当我用一种方法而不是另一种方法时,
groupby
/
apply
会失败,但似乎更容易回答更一般的问题。太好了,这正是我所缺少的!这与to_datetime后面的列有什么不同?(实际上这给了我
ValueError:无法将对象转换为NumPy datetime
…令人困惑)@AndyHayden NumPy已经在1.6和1.8之间进行了主要修复。目前,在我的系统上(numpy 1.8.0和pandas 0.12.0)
pd.to_datetime
忽略该单位,并假设我传递给它的每个数字都是纳秒,这是numpy 1.7错误。Numpy 1.8正确地得到了它。是的,我实际上没有试过。我得到的错误与dmvianna、numpy 1.7.1和pandas 0.12.0的错误相同,但是如果你的方法有效的话,那么你的方法会更好,所以也许我会更新。@dmvianna你需要
unit='D'
,第二个参数不是单位;对我来说很好
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)
import numpy as np
data['time2'] = np.datetime64(data.time, 's')
import pandas as pd
data['time2'] = pd.to_datetime(data.time, unit='s')