[更清楚地编辑根状态问题,如果你使用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)
任何人都知道我错过了什么/做错了吗?
答案 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有下面评论中提到的问题。