python - 用于从一堆日期创建每小时时间序列的 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') 但看起来我做错了
解决方案
找到每个组织和区域的最小值和最大值,并创建一个空数据框并将其组合成最终系统的数据框。将原始数据框与合并后的数据框合并。通过重命名和删除列来完成后处理。
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
推荐阅读
- javascript - 如果无法识别其他条件,为什么我的 Node.js?
- reactjs - 在 re 上更新 defaultValue
- excel - 在 VBA 中使用当前区域会破坏我的 Excel
- python-3.x - 如何在 Gurobi 中获得导致最佳结果的所有解决方案
- flutter - Flutter:将价格本地化限制为仅限英文
- ios - UIView 作为 UITableView 的标头
- javascript - 使引导下拉菜单显示在模式顶部的方法
- python - 删除空元素嵌套列表的 Pythonic 方式和节省时间
- typescript - 动态导入 Typescript 文件作为基于 json 的配置的替代方案
- javascript - 移动的组件不做它的工作(react-redux)