【问题标题】:Iterating over date column with period column until end date; grouping results by id column.使用期间列迭代日期列,直到结束日期;按 id 列对结果进行分组。
【发布时间】:2018-12-31 11:25:23
【问题描述】:

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

我有这些数据:

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 对每个日期进行分组。

谢谢。

【问题讨论】:

  • 重复添加与客户分组有何关系?当您按客户对日期进行分组时,您想用它们做什么? (即将它们存储在嵌套在 DataFrame 内的列表中,取平均值/最大值/最小值/计数)
  • 重复添加的日期是购买的预测。后来我想按公司将每个购买日期按月/季度/年分组,这就是我需要这些特定参数的原因。

标签: python pandas loops datetime


【解决方案1】:

你想做除法,但你考虑的是重复加法。

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,这是一个单独的问题,我相信您可以通过查看已经专门提出的其他问题来解决这个问题。

【讨论】:

  • 问题是,我需要每个 CustomerId 的每个准确迭代日期。这就是为什么我需要按 customerid 对结果进行分组,而不仅仅是为比率创建一个新列。
  • @Chad:哦。好吧,我向您展示了如何找出每个客户有多少个日期 - 尝试对每个客户从开始日期到结束日期使用 np.arange()
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2013-01-16
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多