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