当前位置: 首页 > 面试题库 >

如果日期在2个日期之间,则Python Pandas列中的总和值

从开济
2023-03-14
问题内容

我有一个df可以用此创建的数据框:

data={'id':[1,1,1,1,2,2,2,2],
      'date1':[datetime.date(2016,1,1),datetime.date(2016,1,2),datetime.date(2016,1,3),datetime.date(2016,1,4),
               datetime.date(2016,1,2),datetime.date(2016,1,4),datetime.date(2016,1,3),datetime.date(2016,1,1)],
      'date2':[datetime.date(2016,1,5),datetime.date(2016,1,3),datetime.date(2016,1,5),datetime.date(2016,1,5),
               datetime.date(2016,1,4),datetime.date(2016,1,5),datetime.date(2016,1,4),datetime.date(2016,1,1)],
      'score1':[5,7,3,2,9,3,8,3],
      'score2':[1,3,0,5,2,20,7,7]}
df=pd.DataFrame.from_dict(data)

And looks like this:
   id       date1       date2  score1  score2
0   1  2016-01-01  2016-01-05       5       1
1   1  2016-01-02  2016-01-03       7       3
2   1  2016-01-03  2016-01-05       3       0
3   1  2016-01-04  2016-01-05       2       5
4   2  2016-01-02  2016-01-04       9       2
5   2  2016-01-04  2016-01-05       3      20
6   2  2016-01-03  2016-01-04       8       7
7   2  2016-01-01  2016-01-01       3       7

我需要做的就是为每一个的列score1score2,创造它的SUM值两列score1,并score2分别根据有无usedate之间date1date2usedate通过获取介于date1最小和date2最大之间(包括最小和最大)的所有日期来创建。我用它来创建日期范围:

drange=pd.date_range(df.date1.min(),df.date2.max())

结果数据框newdf应如下所示:

     usedate  score1sum  score2sum
0 2016-01-01          8          8
1 2016-01-02         21          6
2 2016-01-03         32         13
3 2016-01-04         30         35
4 2016-01-05         13         26

为了清楚起见,在usedate2016年1月1日,score1sum是8,这是通过观察在各行计算df,其中2016年1月1日是与包括之间date1date2,其总和ROW0(5)和ROW8(3)。上usedate2016年1月4日,score2sum是35,这是由寻找中的行计算df,其中2016年1月4日是与包括之间date1date2,其总和ROW0(1),ROW3(0),ROW4(5),ROW5(
2),第6(20)行,第7(7)行。

也许某种groupby,或meltgroupby


问题答案:

您可以使用applylambda函数:

df['date1'] = pd.to_datetime(df['date1'])

df['date2'] = pd.to_datetime(df['date2'])

df1 = pd.DataFrame(index=pd.date_range(df.date1.min(), df.date2.max()), columns = ['score1sum', 'score2sum'])

df1[['score1sum','score2sum']] = df1.apply(lambda x: df.loc[(df.date1 <= x.name) & 
                                                            (x.name <= df.date2),
                                                            ['score1','score2']].sum(), axis=1)

df1.rename_axis('usedate').reset_index()

输出:

     usedate  score1sum  score2sum
0 2016-01-01          8          8
1 2016-01-02         21          6
2 2016-01-03         32         13
3 2016-01-04         30         35
4 2016-01-05         13         26


 类似资料:
  • 我试图在两个日期和两个时间之间得到一列的总和,其中日期不同。 我的列是: 表1=时间1、时间2、日期1、日期2 表 2 = 日期、时间、事件 理想情况下,该公式将给出日期1/时间1和日期2/时间2之间的事件总数 我已经尝试了下面的公式,但是我收到的是这两个日期之间的事件总数,而不是这两个日期之间的事件数量。 *对于上下文,Sheet1具有事件数据,“ProductMadness - Postlog

  • 问题内容: 我希望“范围”是一个日期对象数组,两个日期之间的每一天。 诀窍在于它也应该处理月份和年份的边界。 问题答案:

  • 问题内容: 使用标准的mysql函数可以编写查询,该查询将返回两个日期之间的天数列表。 例如,给定2009-01-01和2009-01-13,它将返回一个具有以下值的列表: 编辑:看来我还不清楚。我要生成此列表。我在数据库中存储了值(按日期时间),但希望将它们在左外部联接中汇总到上述日期列表中(我希望这种联接的某些右侧在几天内会为null并将对此进行处理) )。 问题答案: 我将使用此存储过程将所

  • 问题内容: 我想要一个开始日期和结束日期之间的日期列表。 结果应为所有日期的列表,包括开始日期和结束日期。 问题答案: 一次添加一天直到达到结束日期: 实现自己的迭代器也可以做到这一点并不难,那就更好了。

  • 我有一个动态的日期列表,比如说他们相隔3个月,但是这些日期可能会变为相隔5个月、2个月等等 然后我有一个相隔一个月的日期列表。我需要做的是检查相隔1个月的列表中的哪个日期介于动态列表中的哪个月之间。 例如: 动态列表 2012年6月1日 静态列表 2012年6月1日 2012年7月1日 2012年8月1日 2012年9月1日 2012年10月1日 2012年12月1日 2013年1月1日 2013

  • 问题内容: 在我的应用程序中,用户应从选择日期。问题是生成此列​​表。例如,我需要 2010年至2013年 或 6月至8月 之间的所有日期(期间可能是 day , month , year )。是否有任何方法可以获取该数据? 范例:我需要 2013年1月1* 日 至2013年1月1 日之间的日期 * 2013年1月1日 2013年2月1日 2013年3月1日 2013年4月1日 2013年5月1日

  • 问题内容: 我需要生成两个给定日期之间的所有日期。只要只有一个日期范围,此方法就可以正常工作。但是,如果我有多个日期范围,则此解决方案不起作用。我在这里以及Asktom上都进行了搜索,但是找不到相关的指针/解决方案。 我使用all_objects和CONNECT BY ROWNUM尝试了两种解决方案,但是没有运气。这是问题说明:sqlfiddle 输入 输出 问题答案:

  • 我试图在两天之间创建一个天数列表。 我创建了如下解决方案: 但它只在90%的情况下有效(如果有月变化,它就不起作用) 例如,当我选择日期时: 从8月29日到9月30日,从8月31日,它给我打印了几天 有没有办法解决我的问题,或者有更好的办法? 编辑: 我的问题和建议的问题不同,因为在我的问题中,我有两个日期作为输入 例如 在建议的重复结果,这可能是int号 我的问题是如何循环两个日期之间的所有日期