【问题标题】:Pandas Time Series and groupbyPandas 时间序列和 groupby
【发布时间】:2013-12-10 22:18:19
【问题描述】:

[编辑以更清楚地说明根本问题,如果您使用 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)

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

【问题讨论】:

  • 您可能希望使用示例数据、预期输出以及更清晰地说明问题的确切内容来重写您的问题。
  • 你说你的groupby失败了,什么groupby??
  • 在此之后我调用:data.groupby(['source', 'DoY']),这会消除我给出的错误。我将进行编辑以使其清楚。
  • @TristanMatthews 我不明白 dmvianna 的回答是如何解决这个问题的。
  • @AndyHayden 它回答了我的问题,即如何将我想要的数据添加到我的 DataFrame 而不复制它并且可能会弄乱顺序。我仍然不确定为什么 groupby / apply 在我以一种方式而不是另一种方式时会失败,但解决更一般的问题似乎更容易。

标签: python group-by pandas


【解决方案1】:

我不会使用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 存在以下 cmets 中提到的问题。

【讨论】:

  • 完美,这正是我所缺少的!
  • 这与 to_datetime 之后将其设为列有何不同? (实际上这让我ValueError: Could not convert object to 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',第二个参数不是单位;对我来说很好用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2021-08-27
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多