首页 > 解决方案 > 转换包含时间序列的数据框

问题描述

我有这样的数据框:

datestamp              Name            Reading
2018-01-01 00:00:00    A01              40
2018-01-01 01:00:00    A01              50
2018-01-01 03:00:00    A01              50
2018-01-01 01:00:00    A02              50
2018-01-01 02:00:00    A02              40
2018-01-01 03:00:00    A02              30

给定开始和结束日期(开始 =2018-01-01 00:00:00和结束 = 2018-01-01 05:00:00

我想将数据框转换为下面。(对于所有缺失的条目,我们需要有零或 NULL)

输出如:

datestamp              Name            Reading
2018-01-01 00:00:00    A01              40
2018-01-01 01:00:00    A01              50
2018-01-01 02:00:00    A01              00
2018-01-01 03:00:00    A01              50
2018-01-01 04:00:00    A01              00
2018-01-01 05:00:00    A01              00
2018-01-01 00:00:00    A02              00
2018-01-01 01:00:00    A02              50
2018-01-01 02:00:00    A02              40
2018-01-01 03:00:00    A02              30
2018-01-01 04:00:00    A02              00
2018-01-01 05:00:00    A02              00

我没有方向,所以目前还没有办法。

标签: pandas

解决方案


使用 pd.date_range()、df.loc[] 和嵌套的 for 循环:

df

datestamp   Name    Reading
0   2018-01-01 00:00:00 A01 40
1   2018-01-01 01:00:00 A01 50
2   2018-01-01 02:00:00 A01 50
3   2018-01-01 03:00:00 A02 50
4   2018-01-01 04:00:00 A02 40
5   2018-01-01 05:00:00 A02 30
start_date = dt.datetime.strptime('2018-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')
end_date = dt.datetime.strptime('2018-01-01 05:00:00', '%Y-%m-%d %H:%M:%S')
date_range = pd.date_range(start=start_date, end=end_date, freq='H')
for date in date_range:
    for sensor in df.Name.unique():
        if len(df.loc[(df['datestamp'] == date) & (df['Name'] == sensor)]) == 0:
            df=df.append({'datestamp':date, 'Name':sensor, 'Reading':0}, ignore_index=True)
            
df = df.sort_values(by=['Name', 'datestamp']).reset_index(drop=True)
df


datestamp   Name    Reading
0   2018-01-01 00:00:00 A01 40
1   2018-01-01 01:00:00 A01 50
2   2018-01-01 02:00:00 A01 50
3   2018-01-01 03:00:00 A01 0
4   2018-01-01 04:00:00 A01 0
5   2018-01-01 05:00:00 A01 0
6   2018-01-01 03:00:00 A02 50
7   2018-01-01 04:00:00 A02 40
8   2018-01-01 05:00:00 A02 30
9   2018-01-01 00:00:00 A02 0
10  2018-01-01 01:00:00 A02 0
11  2018-01-01 02:00:00 A02 0

请原谅列标题。


推荐阅读