【发布时间】:2014-11-10 16:53:28
【问题描述】:
我需要重塑一个看起来像 df1 的数据框并将其转换为 df2。此过程有 2 个注意事项:
- 我需要能够将要切片的行数设置为参数(长度)。
- 我需要从索引中拆分日期和时间,并使用 reshape 中的日期作为列名并保持时间作为索引。
当前 df1
2007-08-07 18:00:00 1
2007-08-08 00:00:00 2
2007-08-08 06:00:00 3
2007-08-08 12:00:00 4
2007-08-08 18:00:00 5
2007-11-02 18:00:00 6
2007-11-03 00:00:00 7
2007-11-03 06:00:00 8
2007-11-03 12:00:00 9
2007-11-03 18:00:00 10
所需的输出 df2 - 带有参数 'length=5'
2007-08-07 2007-11-02
18:00:00 1 6
00:00:00 2 7
06:00:00 3 8
12:00:00 4 9
18:00:00 5 10
我做了什么:
我的方法是创建一个多索引(日期 - 时间),然后进行数据透视表或某种形式的重塑以实现所需的 df 输出。
import pandas as pd
'''
First separate time and date
'''
df['TimeStamp'] = df.index
df['date'] = df.index.date
df['time'] = df.index.time
'''
Then create a way to separate the slices and make those specific dates available for then create
a multi-index.
'''
for index, row in df.iterrows():
df['Num'] = np.arange(len(df))
for index, row in df.iterrows():
if row['Num'] % 5 == 0:
df.loc[index, 'EventDate'] = df.loc[index, 'Date']
df.set_index(['EventDate', 'Hour'], inplace=True)
del df['Date']
del df['Num']
del df['TimeStamp']
问题:多索引的第一级的每个日期旁边都有一个 NaN。即使效果很好,我也找不到如何使用多索引 df 来做我需要的事情。
我被困住了。我很感激任何意见。
【问题讨论】:
-
你能包含创建df的代码吗? (例如
df.to_dict()) -
@Korem 我手工制作了这个例子:(.....但我认为你可以使用这个 dfx = pd.DataFrame({'A': [1, 2, 3, 2, 5, 2, 5, 3, 2, 0, 5, 1]}, index=pd.date_range('2011-1-2', '2011-01-03 20:00', freq='240T')) ......使用参数长度=6,你会做几乎完全相同的事情。
-
您想要的输出中的日期与输入中的日期不再对应是否正确?
-
@joris 是的,因为重要的是它们对应本例中length=5的每一组的第一行
-
假设长度为 4。最终的索引是多少?
标签: python pandas time-series dataframe multi-index