【发布时间】:2018-02-12 18:56:33
【问题描述】:
我有一个如下所示的 DataFrame:
x = pd.DataFrame({'user': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b','b'], 'rd': ['2016-01-01', '2016-01-01' ,
'2016-02-01', '2016-02-01', '2016-02-01', '2016-05-01', '2016-05-01',
'2016-06-01','2016-06-01', '2016-06-01'],
'fd' : ['2016-02-01', '2016-04-01', '2016-03-01', '2016-04-01', '2016-05-01',
'2016-06-01', '2016-07-01', '2016-08-01', '2016-07-01', '2016-09-01'],
'val': [3, 4, 16, 7, 9, 2, 5, 11, 20, 1]})
x.head(6)
fd rd user val
0 2016-02-01 2016-01-01 a 3
1 2016-04-01 2016-01-01 a 4
2 2016-03-01 2016-02-01 a 16
3 2016-04-01 2016-02-01 a 7
4 2016-05-01 2016-02-01 a 9
5 2016-06-01 2016-05-01 b 2
x['rd'] = pd.to_datetime(x['rd'])
x['fd'] = pd.to_datetime(x['fd'])
对于每个 rd 日期,我希望有接下来 3 个月的日期。例如:
rd = 2016-01-01
我想要:
fd = [2016-02-01, 2016-03-01, 2016-04-01]
基本上:对于每个 rd 日期,我希望接下来的 3 个月作为 fd 日期。
在我的数据集中,我在 rd (2016-03-01, 2016-04-01) 和 fd 中都缺少日期,一旦我有了 rd 日期 (rd = 2016-01-01, fd missing = 2016-03-01)。
此外,我有 2 个不同的用户 x['user'].unique() = ['a', 'b'] 。
因此,我可能在一个用户、另一个用户或两者中都缺少日期(“rd”和“fd”)。
我想要实现的是一种为所有用户获取包含所有日期的数据框的有效方法。
问题从已经回答的Question 开始,但这里的问题有点复杂,因为我无法将 Multiindex 用于手头的问题。
到目前为止,我所做的是创建 2 列日期:
index = pd.date_range(x['rd'].min(),
x['rd'].max(), freq='MS')
from datetime import datetime
from dateutil.relativedelta import relativedelta
def add_months(date):
fcs_dates = [date + relativedelta(months = 1), date + relativedelta(months = 2), date + relativedelta(months = 3)]
return fcs_dates
fcs_dates = list(map(lambda x: add_months(x), index.tolist()))
fcs_dates = [j for i in fcs_dates for j in i]
index3 = index.tolist()*3
index3.sort()
所以输出是:
list(zip(index3, fcs_dates))[:5]
[(Timestamp('2016-01-01 00:00:00', freq='MS'),
Timestamp('2016-02-01 00:00:00', freq='MS')),
(Timestamp('2016-01-01 00:00:00', freq='MS'),
Timestamp('2016-03-01 00:00:00', freq='MS')),
(Timestamp('2016-01-01 00:00:00', freq='MS'),
Timestamp('2016-04-01 00:00:00', freq='MS')),
(Timestamp('2016-02-01 00:00:00', freq='MS'),
Timestamp('2016-03-01 00:00:00', freq='MS')),
(Timestamp('2016-02-01 00:00:00', freq='MS'),
Timestamp('2016-04-01 00:00:00', freq='MS'))]
不幸的是,我不知道如何将其插入 MultiIndex 函数。
感谢您的帮助
【问题讨论】:
标签: python pandas datetime multi-index