首页 > 解决方案 > 使用期间列迭代日期列,直到结束日期;按 id 列对结果进行分组。

问题描述

我知道在这个网站上也有人问过类似的问题,但我看到的其他解决方案并没有真正解决我的问题。

我有这个数据:

sample = pd.DataFrame({'CustomerID': ['1', '2', '3', '4', '5', '6'],
           'Date': np.random.choice(pd.Series(pd.date_range('2018-01-01', 
            freq='D', periods=180)), 6),
           'Credits': np.random.uniform(0,1000,6),
           'Credit Days': np.random.uniform(0, 1000, 6),
          }, columns=['Date', 'CustomerID', 'Credits', 'Credit Days'])
sample

对于每家公司,我基本上想添加'Date' + 'Credit Days',然后从生成的日期开始'Credit Days'再次添加,直到结束日期超过 2020-01-01。我还想在新数据框中按 CustomerID 对每个日期进行分组。

谢谢。

标签: pythonpandasloopsdatetime

解决方案


你想做除法,但你正在考虑重复加法。

doomsday = pd.to_datetime('2020-01-01')
time_left = doomsday - sample.Date
ratio = time_left.dt.days / sample['Credit Days']

这给了你:

0     0.628771
1     4.563582
2     5.528058
3     0.942857
4     1.071486
5    20.097542

您可以根据需要向上或向下舍入,如果您愿意,可以将其相乘:

sample.Date + pd.to_timedelta(sample['Credit Days'], 'd') * ratio.round()

这给了你:

0   2020-12-22 00:20:19.857580800
1   2020-03-09 11:19:03.895536000
2   2020-02-23 10:37:54.541632000
3   2020-02-06 01:26:56.634835200
4   2019-11-18 21:37:24.674937600
5   2019-12-28 13:03:52.781760000

至于 groupby,这是一个单独的问题,我相信您可以通过检查已经专门提出的其他问题来解决这个问题。


推荐阅读