Python 使用间隔之间的每日值填充索引

Python 使用间隔之间的每日值填充索引,python,pandas,indexing,Python,Pandas,Indexing,我目前正在处理一些json文件,其中包含一个值范围为2018-07-05到2019-02-05的数据键和另一个键(balance),我将其用作列。我试图理解如何用每日值填充或替换这些日期,以便当日期存在时,余额列有其相应的值,否则我将得到NaN(然后我将用bfill填充,但我已经知道如何做到这一点) 这是我访问json文件的代码: x = 'C:\\Users\\ivan.libedinsky\\Downloads\\example.json' with open(x, encoding="Ut

我目前正在处理一些json文件,其中包含一个值范围为2018-07-05到2019-02-05的数据键和另一个键(balance),我将其用作列。我试图理解如何用每日值填充或替换这些日期,以便当日期存在时,余额列有其相应的值,否则我将得到NaN(然后我将用bfill填充,但我已经知道如何做到这一点)

这是我访问json文件的代码:

x = 'C:\\Users\\ivan.libedinsky\\Downloads\\example.json'
with open(x, encoding="Utf-8") as w:
    data = json.load(w)
    d = {'onDate':[],'balance':[]}
    for i in data['accountList'][0]['transactionList']:
        d['onDate'].append(i['onDate'])  
        d['balance'].append(i['balance'])
df = pd.DataFrame(d)
df1 = df.groupby('onDate').balance.first()
我得到的结果是:

        onDate  balance
0   2018-07-05     3.73
1   2018-08-01   378.49
2   2018-08-03   328.49
3   2018-08-05   128.49
4   2018-08-06    78.49
..         ...      ...
我试图实现的目标,但我不确定如何实现:

        onDate  balance
0   2018-07-05     3.73
1   2018-07-06      NaN
2   2018-07-07      NaN
3   2018-07-08      NaN
4   2018-07-09      NaN
..         ...      ...
27  2018-08-01    378.49 
..         ...      ...
因此,当我进行回填时(我没有任何问题),我的最终结果是:

        onDate  balance
0   2018-07-05     3.73
1   2018-07-06     3.73
2   2018-07-07     3.73
3   2018-07-08     3.73
4   2018-07-09     3.73
..         ...      ...
27  2018-08-01    378.49 
..         ...      ...
我的第一个想法是创建另一个列表,然后我将使用它与数据帧进行左连接

from datetime import datetime, timedelta
date = min(ondate)
while max(ondate) > max(date):
    date.append(date + timedelta(days=1)
但我不确定这是否是最佳的和可扩展的。提前感谢。

使用:

或者,如果您希望在现有日期范围之外显式地包括开始/结束日期,则可能更通用一些:

# ensure 'onDate' is of the proper dtype
df['onDate'] = pd.to_datetime(df['onDate'])

# reindex, setting/resetting index as appropriate
full_idx = pd.date_range('2018-07-05', '2018-08-06', name='onDate')
df = df.set_index('onDate')
df = df.reindex(full_idx, method='ffill')
df = df.reset_index()
任一方法的结果输出:

       onDate  balance
0  2018-07-05     3.73
1  2018-07-06     3.73
2  2018-07-07     3.73
3  2018-07-08     3.73
4  2018-07-09     3.73
5  2018-07-10     3.73
6  2018-07-11     3.73
7  2018-07-12     3.73
8  2018-07-13     3.73
9  2018-07-14     3.73
10 2018-07-15     3.73
11 2018-07-16     3.73
12 2018-07-17     3.73
13 2018-07-18     3.73
14 2018-07-19     3.73
15 2018-07-20     3.73
16 2018-07-21     3.73
17 2018-07-22     3.73
18 2018-07-23     3.73
19 2018-07-24     3.73
20 2018-07-25     3.73
21 2018-07-26     3.73
22 2018-07-27     3.73
23 2018-07-28     3.73
24 2018-07-29     3.73
25 2018-07-30     3.73
26 2018-07-31     3.73
27 2018-08-01   378.49
28 2018-08-02   378.49
29 2018-08-03   328.49
30 2018-08-04   328.49
31 2018-08-05   128.49
32 2018-08-06    78.49
       onDate  balance
0  2018-07-05     3.73
1  2018-07-06     3.73
2  2018-07-07     3.73
3  2018-07-08     3.73
4  2018-07-09     3.73
5  2018-07-10     3.73
6  2018-07-11     3.73
7  2018-07-12     3.73
8  2018-07-13     3.73
9  2018-07-14     3.73
10 2018-07-15     3.73
11 2018-07-16     3.73
12 2018-07-17     3.73
13 2018-07-18     3.73
14 2018-07-19     3.73
15 2018-07-20     3.73
16 2018-07-21     3.73
17 2018-07-22     3.73
18 2018-07-23     3.73
19 2018-07-24     3.73
20 2018-07-25     3.73
21 2018-07-26     3.73
22 2018-07-27     3.73
23 2018-07-28     3.73
24 2018-07-29     3.73
25 2018-07-30     3.73
26 2018-07-31     3.73
27 2018-08-01   378.49
28 2018-08-02   378.49
29 2018-08-03   328.49
30 2018-08-04   328.49
31 2018-08-05   128.49
32 2018-08-06    78.49