我尝试从开始日期和结束日期创建一个数据框,用于多个asset_id并将其转换为开始日期和结束日期之间每个asset_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
例如dumb for-loop如下所示。
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
我很高兴获得了多索引并且可以手动设置最后一个日期时间(或者可以实际排除行)。
这看起来像一个明智的方法吗?如果是,请回答问题!
答案 0 :(得分:0)
这不是我的例子给出的答案,但它会做的!
df2 = df.set_index('HH').groupby('asset_id').resample('30T').ffill().drop('asset_id',axis=1)
(之前接近这个,但错字意味着我认为这种方法不起作用!)