Python pandas:填充缺少/跳过日期的行

时间:2017-07-04 23:23:17

标签: python-3.x pandas datetime timestamp padding

我有以下数据框:

 date        my_count
--------------------------
2017-01-01         6
2017-01-04         5
2017-01-05         3
2017-01-08         8

我想用my_count = 0填充跳过的日期,因此填充的数据框将如下所示:

 date        my_count
--------------------------
2017-01-01         6
2017-01-02         0
2017-01-03         0
2017-01-04         5
2017-01-05         3
2017-01-06         0
2017-01-07         0
2017-01-08         8

除了逐行检查数据框外,还有更优雅的方法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

第一个选项Title.objects .annotate(dbl_price=2*F('price')) .annotate(_sum_of_prices=Sum('dbl_price')) .values('publisher', '_sum_of_prices') .annotate(sum_of_prices=F('_sum_of_prices') .values('publisher', 'sum_of_prices') .order_by('publisher')

resample

df['date'] = pd.to_datetime(df['date']) df = df.set_index('date') print(df.resample('D').sum().fillna(0).reset_index()) date my_count 0 2017-01-01 6.0 1 2017-01-02 0.0 2 2017-01-03 0.0 3 2017-01-04 5.0 4 2017-01-05 3.0 5 2017-01-06 0.0 6 2017-01-07 0.0 7 2017-01-08 8.0 的第二个选项reindex

date_range

答案 1 :(得分:1)

如果DatetimeIndex的值是唯一使用:

您可以indexasfreq使用DatetimeIndex的最小值或最大值,或者使用第一个和最后一个(如果df['date'] = pd.to_datetime(df['date']) df = df.set_index('date') print(df.asfreq('D', fill_value=0).reset_index()) date my_count 0 2017-01-01 6 1 2017-01-02 0 2 2017-01-03 0 3 2017-01-04 5 4 2017-01-05 3 5 2017-01-06 0 6 2017-01-07 0 7 2017-01-08 8 rng = pd.date_range(df.index.min(), df.index.max()) #alternative #rng = pd.date_range(df.index[0], df.index[-1]) print(df.reindex(rng, fill_value=0).rename_axis('date').reset_index()) date my_count 0 2017-01-01 6 1 2017-01-02 0 2 2017-01-03 0 3 2017-01-04 5 4 2017-01-05 3 5 2017-01-06 0 6 2017-01-07 0 7 2017-01-08 8 已排序):

DatetimeIndex

如果mean不是唯一的,请获取:

  

ValueError:无法从重复轴重新索引

然后需要reindex使用NaNresamplegroupby这样的聚合函数,最后用Grouper替换print (df) date my_count 0 2017-01-01 4 <-duplicate date 1 2017-01-01 6 <-duplicate date 2 2017-01-04 5 3 2017-01-05 3 4 2017-01-08 8 df['date'] = pd.to_datetime(df['date']) print(df.resample('D', on='date')['my_count'].mean().fillna(0).reset_index()) date my_count 0 2017-01-01 5.0 1 2017-01-02 0.0 2 2017-01-03 0.0 3 2017-01-04 5.0 4 2017-01-05 3.0 5 2017-01-06 0.0 6 2017-01-07 0.0 7 2017-01-08 8.0 df = df.set_index('date') print(df.groupby(pd.Grouper(freq='D'))['my_count'].mean().fillna(0).reset_index()) date my_count 0 2017-01-01 5.0 1 2017-01-02 0.0 2 2017-01-03 0.0 3 2017-01-04 5.0 4 2017-01-05 3.0 5 2017-01-06 0.0 6 2017-01-07 0.0 7 2017-01-08 8.0

{{1}}