首页 > 解决方案 > 用于从一堆日期创建每小时时间序列的 Python 函数

问题描述

我有以下形式的数据

         org    area   date        sales
         abc    NY     01/06/2020   120
         abc    NY     01/13/2020   220
         abc    NY     01/20/2020   210
         ...
         abc    NY     07/20/2020   123
         xyz    OR     01/06/2020   121
         xyz    OR     01/13/2020   200
         ...
         xyz    OR     07/20/2020   223

等等..

我想以此创建一个每小时的时间序列,例如

         org    area   date        hour     sales
         abc    NY     01/06/2020   0        120
         abc    NY     01/06/2020   1        120
         abc    NY     01/06/2020   2        120 
         abc    NY     01/06/2020   3        120  
         abc    NY     01/06/2020   4        120
         abc    NY     01/06/2020   5        120
         ....
         abc    NY     01/06/2020   23       120
         abc    NY     01/07/2020   0        120
         abc    NY     01/07/2020   1        120
         ...
         abc    NY     07/20/2020   23       111
         xyz    OR     01/06/2020   1        120
         xyz    OR     01/06/2020   2        120
         ...
         xyz    OR     07/20/2020   23        120

等等...

我需要在 2020 年 1 月 6 日到 2020 年 7 月 20 日之间为几组组织和区域执行此操作

我尝试了代码 a.set_index('date').groupby('org','area').resample('W', how='sum') 但看起来我做错了

标签: pythonpandastime-series

解决方案


找到每个组织和区域的最小值和最大值,并创建一个空数据框并将其组合成最终系统的数据框。将原始数据框与合并后的数据框合并。通过重命名和删除列来完成后处理。

import pandas as pd
import numpy as np
import io

data = '''
org area date sales
abc NY 01/06/2020 120
abc NY 01/13/2020 220
abc NY 01/20/2020 210
abc NY 07/20/2020 123
xyz OR 01/06/2020 121
xyz OR 01/13/2020 200
xyz OR 07/20/2020 223
'''

df = pd.read_csv(io.StringIO(data), sep='\s+')
date_maxmin = df.groupby(['org','area']).agg(min=('date','min'), max=('date','max'))

date_maxmin.reset_index(inplace=True)

df_all = pd.DataFrame(index=[], columns=['org','area','date'])
for index,row in date_maxmin.iterrows():
    #print(row[2], row[3])
    date_rng = pd.date_range(row[2], row[3], freq='1H')
    l = len(date_rng)
    tmp = pd.DataFrame({'org':[row[0]]*l, 'area':[row[1]]*l, 'date':date_rng})
    df_all = df_all.append(tmp, ignore_index=True)

df_all['hour'] = df_all['date'].dt.hour
df_all['date'] = df_all['date'].dt.date
df_all = pd.concat([df_all,df], keys=['org','area','date'], join='outer', axis=1)
df_all.columns = ['org','area','date','hour','tmp_org','tmp_area','tmp_date','sales']
df_all.drop(['tmp_org','tmp_area','tmp_date'], axis=1, inplace=True)

df_all
    org area    date    hour    sales
0   abc NY  2020-01-06  0   120.0
1   abc NY  2020-01-06  1   220.0
2   abc NY  2020-01-06  2   210.0
3   abc NY  2020-01-06  3   123.0
4   abc NY  2020-01-06  4   121.0
... ... ... ... ... ...
9405    xyz OR  2020-07-19  20  NaN
9406    xyz OR  2020-07-19  21  NaN
9407    xyz OR  2020-07-19  22  NaN
9408    xyz OR  2020-07-19  23  NaN
9409    xyz OR  2020-07-20  0   NaN
9410 rows × 5 columns

找到每个组织和区域的最小值和最大值,并创建一个空数据框并将其组合成最终系统的数据框。

date_maxmin
    org area    min max
0   abc NY  01/06/2020  07/20/2020
1   xyz OR  01/06/2020  07/20/2020

推荐阅读