我目前正在处理一些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)
但是我不确定这是否是最佳且可扩展的。预先感谢。
答案 0 :(得分:1)
# 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