【发布时间】:2018-09-11 19:09:12
【问题描述】:
我正在尝试从开始日期和结束日期创建一个数据框,用于多个资产 ID,并将其转换为开始和结束日期之间每个资产 ID 的半小时列表,其中填充了 some_property 的值前进。
我已尝试从 SO 的文档和示例中进行分组和重新采样,但我不知道如何完成这项工作。
考虑例子:
some_time = datetime(2018,4,2,20,20,42)
start_date = datetime(some_time.year,some_time.month,some_time.day).astimezone(pytz.timezone('Europe/London'))
end_date = start_date + timedelta(days=1)
start_date = start_date + timedelta(hours=some_time.hour,minutes=(0 if some_time.minute < 30 else 30 ))
df = pd.DataFrame(['A','B'],columns=['asset_id'])
df2=df.copy()
df['HH'] = start_date
df2['HH'] = end_date
df['some_property']=0
df.loc[df['asset_id']=='B','some_property']=2
df = df.append(df2)
print(df)
例子df:
HH asset_id some_property
0 2018-04-02 20:00:00+01:00 A 0.0
1 2018-04-02 20:00:00+01:00 B 2.0
0 2018-04-03 00:00:00+01:00 A NaN
1 2018-04-03 00:00:00+01:00 B NaN
我想要的 df 是这样的:
HH asset_id some_property
0 2018-04-02 20:00:00+01:00 A 0
4 2018-04-02 20:30:00+01:00 A 0
6 2018-04-02 21:00:00+01:00 A 0
...
2 2018-04-03 00:00:00+01:00 A 0
1 2018-04-02 20:00:00+01:00 B 2
5 2018-04-02 20:30:00+01:00 B 2
...
3 2018-04-03 00:00:00+01:00 B 2
愚蠢的for循环示例如下。
for ii in range(1,((24-some_time.hour)*2)-1):
temp_time = start_date + timedelta(minutes=30*ii)
for jj in ['A','B']:
df2 = df.append({'asset_id':jj,'HH':temp_time,'some_property':(0 if jj=='A' else 2)},ignore_index=True)
df = df2
df.loc[2,'some_property']=0
df.loc[3,'some_property']=2
有人可以帮忙吗?我正在尝试创建虚拟数据并遇到麻烦。实际上,在重新采样和填充之前,我的虚拟数据的每个asset_id 会有多行。
更新
这可能是在正确的轨道上:
df2 = df.set_index('HH').groupby('asset_id').resample('30T').ffill().drop('asset_id',axis=1)
给我:
some_property
asset_id HH
A 2018-04-02 20:00:00+01:00 0.0
2018-04-02 20:30:00+01:00 0.0
2018-04-02 21:00:00+01:00 0.0
...
2018-04-03 00:00:00+01:00 NaN
B 2018-04-02 20:00:00+01:00 2.0
2018-04-02 20:30:00+01:00 2.0
...
2018-04-03 00:00:00+01:00 NaN
我很高兴获得了多索引并且可以手动设置最后一个日期时间(或者实际上可以排除行)。
这看起来是一种明智的方法吗?如果是,问题已回答!
【问题讨论】:
-
重采样 + 填充
-
我应该向您展示我尝试过多少次使用 resample 和 ffill 的 duff 尝试? :D 我会尝试找到最接近我的示例的链接....
-
可以用 pd.date_range 创建你的 df 吗?
-
我可以做,但我仍然在填充之前添加任意(给你!)时间,在填充之前为“some_property”添加不同的值......或者我应该在之后添加它们!?我可以在此示例之后添加它们,但最终我希望将我从其他地方提取的稀疏(日期时间)矩阵转换为半小时一次的 dfs。
-
这看起来很接近,但用于插值而不是填充,对我来说似乎是死胡同。 stackoverflow.com/questions/37057187/…
标签: pandas pandas-groupby