在Pandas系列中丢失时间段并填入0值

时间:2015-07-23 01:45:00

标签: python pandas group-by

我有一个熊猫系列 (我是通过两个专栏组成的 private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.SetParent(this); frm2.ShowDialog(); } ):

divvy_df.groupby(['from_station_name', 'starttime']).size()

如您所见,生成的系列显示了为该工作站名称记录启动时间的次数。我想以某种方式制作它,以便创建缺少时隙并使用值0填充。这可能吗?

所以我想要这样的事情:

from_station_name       starttime          
900 W Harrison          2014-07-01 08:00:00    1
                        2014-07-01 10:00:00    1
                        2014-07-01 11:00:00    1
                        2014-07-01 12:00:00    1
                        2014-07-01 13:00:00    1
                        2014-07-01 16:00:00    1
                        2014-07-01 17:00:00    3
                        2014-07-01 22:00:00    1
                        2014-07-02 01:00:00    1
                        2014-07-02 08:00:00    1
                        2014-07-02 12:00:00    2
                        ...

完成这样的事情的最佳方式是什么?

1 个答案:

答案 0 :(得分:4)

通常当你有一个使用DatetimeIndex的系列ts时,你可以将它扩展为 使用ts.reindexts.asfreqts.resample添加新日期。 由于ts.reindex有一个fill_value参数用于填写缺失值,我 认为在这种情况下使用ts.reindex最容易。

但是,在此问题中,ts具有带from_station_name和的starttime的MultiIndex from_station_name级别。

因此,第一步是将reset_index级别移出索引。 有两种选择。您可以使用unstack将其移至列,或使用 unstacking将其移至新的列索引级别。我认为ts = ts.unstack(level=0)

reset_index

是更好的选择,因为使用其他选项(使用from_station_name) 你遇到与索引中的重复日期相关的问题,以及问题 回填和向前填充缺少reindex值。

现在系列有一个单一级别的DatetimeIndex,所以你可以index = pd.date_range('2014-07-01', '2014-07-03', freq='H') ts = ts.reindex(index, fill_value=0) 这样:

unstack

现在撤消ts = ts.stack() ts = ts.swaplevel(0,1) 操作,从而将列索引级别移回 进入行索引:

import pandas as pd
ts = pd.Series({('900 W Harrison', '2014-07-01 08:00:00'): 1,
 ('900 W Harrison', '2014-07-01 10:00:00'): 1,
 ('900 W Harrison', '2014-07-01 11:00:00'): 1,
 ('900 W Harrison', '2014-07-01 12:00:00'): 1,
 ('900 W Harrison', '2014-07-01 13:00:00'): 1,
 ('900 W Harrison', '2014-07-01 16:00:00'): 1,
 ('900 W Harrison', '2014-07-01 17:00:00'): 3,
 ('900 W Harrison', '2014-07-01 22:00:00'): 1,
 ('900 W Harrison', '2014-07-02 01:00:00'): 1,
 ('900 W Harrison', '2014-07-02 08:00:00'): 1,
 ('900 W Harrison', '2014-07-02 12:00:00'): 2})

ts = ts.unstack(level=0)
# ensure ts.index is a DatetimeIndex
ts.index = pd.to_datetime(ts.index)
index = pd.date_range('2014-07-01', '2014-07-03', freq='H')
ts = ts.reindex(index, fill_value=0)
ts = ts.stack()
ts = ts.swaplevel(0,1)
ts = ts.sortlevel()
print(ts)
900 W Harrison  2014-07-01 00:00:00    0
                2014-07-01 01:00:00    0
                2014-07-01 02:00:00    0
                2014-07-01 03:00:00    0
                2014-07-01 04:00:00    0
                2014-07-01 05:00:00    0
                2014-07-01 06:00:00    0
                2014-07-01 07:00:00    0
                2014-07-01 08:00:00    1
                2014-07-01 09:00:00    0
                2014-07-01 10:00:00    1
                ...
                2014-07-02 21:00:00    0
                2014-07-02 22:00:00    0
                2014-07-02 23:00:00    0
                2014-07-03 00:00:00    0
dtype: int64

产量

viewForRow: