如何在缺少日期的情况下重新采样重新采样的熊猫DataFrame以保持当前值

时间:2019-05-20 10:36:51

标签: python django pandas

我有一个数据框,其索引是一个月的子集。我要添加从第一天到最后一天的所有日期,将不存在的值填充为0并保留现有的值。

我尝试过重新索引,但是所有尝试都以缺少数据为结束。

这是我的示例DataFrame:

checkin_date                    checkout_date        duration              
0 2019-05-20 08:48:09.630928+00:00 2019-05-20 09:51:55.130997+00:00  01:03:45.500069
1 2019-05-20 08:39:12.660055+00:00 2019-05-20 09:51:55.130997+00:00 01:12:42.470942
2 2019-05-19 16:38:15.195097+00:00 2019-05-20 08:20:49.860755+00:00 15:42:34.665658
3 2019-05-19 16:20:29.513691+00:00 2019-05-20 07:41:46.928414+00:00 15:21:17.414723
4 2019-05-07 12:06:02.255836+00:00 2019-05-07 17:30:22.550536+00:00 05:24:20.294700
5 2019-05-07 11:00:19.765565+00:00 2019-05-07 11:10:33.792748+00:00 00:10:14.027183

我这样做是为了重新采样:

df.set_index('checkin_date').resample('D').sum()

这提供了从一个月的第一个现有日期到最后一个现有日期的DataFrame:

                                    duration
checkin_date                                    
2019-05-07 00:00:00+00:00 0 days 05:34:34.321883
2019-05-08 00:00:00+00:00        0 days 00:00:00
2019-05-09 00:00:00+00:00        0 days 00:00:00
2019-05-10 00:00:00+00:00        0 days 00:00:00
2019-05-11 00:00:00+00:00        0 days 00:00:00
2019-05-12 00:00:00+00:00        0 days 00:00:00
2019-05-13 00:00:00+00:00        0 days 00:00:00
2019-05-14 00:00:00+00:00        0 days 00:00:00
2019-05-15 00:00:00+00:00        0 days 00:00:00
2019-05-16 00:00:00+00:00        0 days 00:00:00
2019-05-17 00:00:00+00:00        0 days 00:00:00
2019-05-18 00:00:00+00:00        0 days 00:00:00
2019-05-19 00:00:00+00:00 1 days 07:03:52.080381
2019-05-20 00:00:00+00:00 0 days 02:16:27.971011

这是完美的。但是我需要使用月份中缺少的日期来完成DataFrame:第一天和最后几天。

所以我尝试类似的方法来重新编制索引:

idx = pd.date_range(datetime(year=2019, month=5, day=1), datetime(year=2019, month=5, day=31))
df.reindex(idx, fill_value=0)

首先,该最后一条命令在所有单元格上均得出零。我尝试过重新设置df索引或idx,但是没有任何效果。

有什么主意吗?

1 个答案:

答案 0 :(得分:2)

使用DatetimeIndex.tz_localize

df1 = (df.set_index('ckin_date')
         .resample('D')
         .sum()
         .reindex(idx.tz_localize('UTC'), fill_value=0))

print (df1)

                                        duration
2019-05-01 00:00:00+00:00        0 days 00:00:00
2019-05-02 00:00:00+00:00        0 days 00:00:00
2019-05-03 00:00:00+00:00        0 days 00:00:00
2019-05-04 00:00:00+00:00        0 days 00:00:00
2019-05-05 00:00:00+00:00        0 days 00:00:00
2019-05-06 00:00:00+00:00        0 days 00:00:00
2019-05-07 00:00:00+00:00 0 days 05:34:34.321883
2019-05-08 00:00:00+00:00        0 days 00:00:00
2019-05-09 00:00:00+00:00        0 days 00:00:00
2019-05-10 00:00:00+00:00        0 days 00:00:00
2019-05-11 00:00:00+00:00        0 days 00:00:00
2019-05-12 00:00:00+00:00        0 days 00:00:00
2019-05-13 00:00:00+00:00        0 days 00:00:00
2019-05-14 00:00:00+00:00        0 days 00:00:00
2019-05-15 00:00:00+00:00        0 days 00:00:00
2019-05-16 00:00:00+00:00        0 days 00:00:00
2019-05-17 00:00:00+00:00        0 days 00:00:00
2019-05-18 00:00:00+00:00        0 days 00:00:00
2019-05-19 00:00:00+00:00 1 days 07:03:52.080381
2019-05-20 00:00:00+00:00 0 days 02:16:27.971011
2019-05-21 00:00:00+00:00        0 days 00:00:00
2019-05-22 00:00:00+00:00        0 days 00:00:00
2019-05-23 00:00:00+00:00        0 days 00:00:00
2019-05-24 00:00:00+00:00        0 days 00:00:00
2019-05-25 00:00:00+00:00        0 days 00:00:00
2019-05-26 00:00:00+00:00        0 days 00:00:00
2019-05-27 00:00:00+00:00        0 days 00:00:00
2019-05-28 00:00:00+00:00        0 days 00:00:00
2019-05-29 00:00:00+00:00        0 days 00:00:00
2019-05-30 00:00:00+00:00        0 days 00:00:00
2019-05-31 00:00:00+00:00        0 days 00:00:00