【问题标题】:Pandas ffill resampled data grouped by columnPandas 填充按列分组的重新采样数据
【发布时间】: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


【解决方案1】:

这不是我的示例答案给出的,但它会做!

df2 = df.set_index('HH').groupby('asset_id').resample('30T').ffill().drop('asset_id',axis=1)

(之前接近过这个,但错字意味着我认为这种方法不起作用!)

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多