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

时间:2019-08-15 15:48:06

标签: python pandas indexing

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

这是我访问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)

但是我不确定这是否是最佳且可扩展的。预先感谢。

1 个答案:

答案 0 :(得分:1)

使用DataFrame.resample

# ensure 'onDate' column has been converted to timestamps
df['onDate'] = pd.to_datetime(df['onDate'])

# resample, setting/resetting index as appropriate
df = df.set_index('onDate')
df = df.resample('D').ffill()
df = df.reset_index()

或者,如果您想显式地包括现有日期范围之外的开始/结束日期,则DataFrame.reindex可能更通用:

# 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