重新采样pandas数据帧并将结果放入列中,将日期作为索引

时间:2017-09-19 11:06:48

标签: python pandas dataframe shape

我有一个每30分钟有一次功率的数据集。

它的时间戳为2016-06-01 00:00:00格式的索引 2016-06-01 00:00:00等

我可以使用df.groupby(pf.TimeGrouper(freq='D'))对数据进行分组 但我希望将组的内容放在1-48列中,因此结果数据集的每一行左侧都有一天,右侧有48个幂项。

原始数据

2016-06-01 00:00:00 5
2016-06-01 00:30:00 9
2016-06-01 01:00:00 12

目标

DATETIME 00:00:00 00:30:00 01:00:00
2016-06-01 5 9 12

我确定必须有一条规则我可以​​用来添加到timegrouper行的末尾,例如从所有值中创建一个列表并将它们转换成一行?

2 个答案:

答案 0 :(得分:1)

示例数据:

import pandas as pd

times = ["2016-06-01 00:00:00", "2016-06-01 00:30:00", "2016-06-01 01:00:00"]
vals = [5, 9, 12]
df = pd.DataFrame(dict(time = times, value = vals))

将时间分为日期和时间:

df["time"] = pd.to_datetime(df.time)
df["date"] = df.time.dt.date
df["time"] = df.time.dt.time

       time  value        date
0  00:00:00      5  2016-06-01
1  00:30:00      9  2016-06-01
2  01:00:00     12  2016-06-01

然后转动数据:

df.pivot(index="date", columns="time", values="value")

time        00:00:00  00:30:00  01:00:00
date                                
2016-06-01         5         9        12

答案 1 :(得分:1)

你可以

In [881]: df.set_index([df.time.dt.date, df.time.dt.time])['value'].unstack()
Out[881]:
time        00:00:00  00:30:00  01:00:00
time
2016-06-01         5         9        12

重命名轴

In [903]: (df.set_index([df.time.dt.date, df.time.dt.time])['value'].unstack()
             .rename_axis(None).rename_axis('DATETIME', 1))
Out[903]:
DATETIME    00:00:00  00:30:00  01:00:00
2016-06-01         5         9        12

或者,而不是set_index使用groupby

In [907]: df.groupby([df.time.dt.date, df.time.dt.time])['value'].sum().unstack()
Out[907]:
time        00:00:00  00:30:00  01:00:00
time
2016-06-01         5         9        12
相关问题