首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果date介于2个日期之间,则列中的Python Pandas总和值

如果date介于2个日期之间,则列中的Python Pandas总和值
EN

Stack Overflow用户
提问于 2018-01-04 21:28:34
回答 3查看 12.5K关注 0票数 8

我有一个数据帧df,它可以用下面的命令创建:

代码语言:javascript
运行
AI代码解释
复制
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创建一个列,该列根据usedate是否在date1date2之间创建两个列,这两个列分别将score1score2的值相加。通过获取介于date1最小值和date2最大值之间的所有日期来创建usedate。我使用它来创建日期范围:

代码语言:javascript
运行
AI代码解释
复制
drange=pd.date_range(df.date1.min(),df.date2.max())    

生成的dataframe newdf应该如下所示:

代码语言:javascript
运行
AI代码解释
复制
     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

为了澄清起见,在usedate 2016-01-01上,score1sum是8,这是通过查看df中的行来计算的,其中2016-01-01介于date1date2之间,其中包括row0(5)和row8(3)。在usedate 2016-01-04上,score2sum为35,这是通过查看df中的行计算得出的,其中2016-01-04位于date1date2之间(包括它们),它们的总和为row0(1)、row3(0)、row4(5)、row5(2)、row6(20)、row7(7)。

也许是某种groupby,或者是melt,然后是groupby

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-05 04:01:31

您可以将apply与lambda函数一起使用:

代码语言:javascript
运行
AI代码解释
复制
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()

输出:

代码语言:javascript
运行
AI代码解释
复制
     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
票数 6
EN

Stack Overflow用户

发布于 2018-01-05 03:44:20

方法1:列表理解

这是不优雅的,但嘿,它是有效的!(编辑:在下面添加了第二种方法。)

代码语言:javascript
运行
AI代码解释
复制
# Convert datetime.date to pandas timestamps for easier comparisons
df['date1'] = pd.to_datetime(df['date1'])
df['date2'] = pd.to_datetime(df['date2'])

# solution
newdf = pd.DataFrame(data=drange, columns=['usedate'])
# for each usedate ud, get all df rows whose dates contain ud,
# then sum the scores of these rows
newdf['score1sum'] = [df[(df['date1'] <= ud) & (df['date2'] >= ud)]['score1'].sum() for ud in drange]
newdf['score2sum'] = [df[(df['date1'] <= ud) & (df['date2'] >= ud)]['score2'].sum() for ud in drange]

# output
newdf
     usedate  score1sum  score2sum
  2016-01-01          8          8
  2016-01-02         21          6
  2016-01-03         32         13
  2016-01-04         30         35
  2016-01-05         13         26

方法2:一个带有transform (或apply)的助手函数

代码语言:javascript
运行
AI代码解释
复制
newdf = pd.DataFrame(data=drange, columns=['usedate'])

def sum_scores(d):
    return df[(df['date1'] <= d) & (df['date2'] >= d)][['score1', 'score2']].sum()

# apply works here too, and is about equally fast in my testing
newdf[['score1sum', 'score2sum']] = newdf['usedate'].transform(sum_scores)

# newdf is same to above

计时是可比较的

代码语言:javascript
运行
AI代码解释
复制
# Jupyter timeit cell magic
%%timeit 
newdf['score1sum'] = [df[(df['date1'] <= d) & (df['date2'] >= d)]['score1'].sum() for d in drange]
newdf['score1sum'] = [df[(df['date1'] <= d) & (df['date2'] >= d)]['score2'].sum() for d in drange]

100 loops, best of 3: 10.4 ms per loop

# Jupyter timeit line magic
%timeit newdf[['score1sum', 'score2sum']] = newdf['usedate'].transform(sum_scores) 

100 loops, best of 3: 8.51 ms per loop
票数 1
EN

Stack Overflow用户

发布于 2021-10-17 03:11:22

来自pyjanitorconditional_join在抽象/便利性方面可能很有帮助:

代码语言:javascript
运行
AI代码解释
复制
# pip install pyjanitor
import pandas as pd
import janitor as jn

drange = pd.DataFrame(drange, columns=['dates'])
df['date1'] = pd.to_datetime(df['date1'])
df['date2'] = pd.to_datetime(df['date2'])

(drange.conditional_join(df, 
                         ('dates', 'date1', '>='), 
                         ('dates', 'date2', '<='))
.droplevel(0, 1)
.select_columns('dates', 'score*')
.groupby('dates')
.sum()
.add_suffix('num')
) 
            score1num  score2num
dates                           
2016-01-01          8          8
2016-01-02         21          6
2016-01-03         32         13
2016-01-04         30         35
2016-01-05         13         26
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48103845

复制
相关文章
python | pandas 改变列的位置、填充缺失值
本期的文章源于工作中,需要固定label的位置,便于在spark模型中添加或删除特征,而不影响模型的框架或代码。 spark的jupyter下使用sql 这是我的工作环境的下情况,对你读者的情况,需要具体分析。 sql = ''' select * from tables_names -- hdfs下的表名 where 条件判断 ''' Data = DB.impala_query(sql) -- 是DataFrame格式 **注意:**DB是自己写的脚本文件 改变列的位置 前
努力在北京混出人样
2018/05/14
5.4K0
python | pandas 改变列的位置、填充缺失值
本期的文章源于工作中,需要固定label的位置,便于在spark模型中添加或删除特征,而不影响模型的框架或代码。 spark的jupyter下使用sql 这是我的工作环境的下情况,对你读者的情况,需要具体分析。 sql = ''' select * from tables_names -- hdfs下的表名 where 条件判断 ''' Data = DB.impala_query(sql) -- 是DataFrame格式 **注意:**DB是自己写的脚本文件 改变列的
努力在北京混出人样
2019/02/18
5.1K0
Pandas 查找,丢弃列值唯一的列
数据清洗很重要,本文演示如何使用 Python Pandas 来查找和丢弃 DataFrame 中列值唯一的列,简言之,就是某列的数值除空值外,全都是一样的,比如:全0,全1,或者全部都是一样的字符串如:已支付,已支付,已支付…
萝 卜
2022/05/12
6K0
Pandas 查找,丢弃列值唯一的列
python的日期模块time,date
转义符对应意义如下 %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %j 年内的一天(001-366) %m 月份(01-12) %M 分钟数(00=59) %p 本地A.M.或P.M.的等价符 %S 秒(00-59) %U 一年中的星期数(00-53)星期天为星期的开始 %w 星期(0-6),星期天为星期的开始 %W 一年中的星期数(00-53)星期一为星期的开始 %x 本地相应的日期表示 %X 本地相应的时间表示 %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %Z 当前时区的名称 %% %号本身
py3study
2020/01/09
7940
java中Date日期类型的大小比较
文章目录 方法一:CompareTo() 方法二:getTime() 方法一:CompareTo() 调用CompareTo(Date anotherDate)方法,API如下: public int compareTo(Date anotherDate) 参数:anotherDate—要比较的Date 结果:如果参数Date等于此Date,则值为0 ; 如果此日期在Date参数之前,该值小于0 ; 如果此日期在Date参数0则值大于0 异常:NullPointerException - 如果 anoth
别团等shy哥发育
2023/02/25
4K0
用过Excel,就会获取pandas数据框架中的值、行和列
至此,我们已经学习了使用Python pandas来输入/输出(即读取和保存文件)数据,现在,我们转向更深入的部分。
fanjy
2021/11/29
19.9K0
用过Excel,就会获取pandas数据框架中的值、行和列
javascript中如何正确将日期(Date)字符串转换为日期(Date)对象?
因近日一个项目中要在客户端判断用户输入的日期字符串的大小,所以对日期字符串转日期对象研究了一下,测试代码如下: <script. type="text/javascript"> var sDate1 = "2008/04/02"; var sDate2 = "2005/03/01"; var oDate1 = new Date(sDate1); var oDate2 = new Date(sDate2); if (oDate1 > oDate2)//输出 2008/04/
菩提树下的杨过
2018/01/22
5.9K0
对比Excel,Python pandas删除数据框架中的列
删除列也是Excel中的常用操作之一,可以通过功能区或者快捷菜单中的命令或者快捷键来实现。上一篇文章,我们讲解了Python pandas删除数据框架中行的一些方法,删除列与之类似。然而,这里想介绍一些新方法。取决于实际情况,正确地使用一种方法可能比另一种更好。
fanjy
2022/04/13
7.5K0
对比Excel,Python pandas删除数据框架中的列
Date() 日期格式的处理
实体对象 /** * 开始时间 */ @TableField("start_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startTime; 页面 (参考 用插件的) /* 开始时间 */ laydate({ elem: '#startTime', event: 'focus', format:
用户5927264
2019/08/01
2.7K0
删除列中的 NULL 值
今天接到一个群友的需求,有一张表的数据如图 1,他希望能通过 SQL 查询出图 2 的结果。
白日梦想家
2020/07/20
10.3K0
删除列中的 NULL 值
Python pandas十分钟教程
Pandas是数据处理和数据分析中最流行的Python库。本文将为大家介绍一些有用的Pandas信息,介绍如何使用Pandas的不同函数进行数据探索和操作。 包括如何导入数据集以及浏览,选择,清理,索引,合并和导出数据等常用操作的函数使用,这是一个很好的快速入门指南,如果你已经学习过pandas,那么这将是一个不错的复习。
深度学习与Python
2019/06/18
10K0
3 个不常见但非常实用的Pandas 使用技巧
我们创建有一个 3 列 100 行的 DataFrame。date 列包含 100 个连续日期,class 列包含 4 个以对象数据类型存储的不同值,amount 列包含 10 到 100 之间的随机整数。
deephub
2022/06/04
1.8K0
3 个不常见但非常实用的Pandas 使用技巧
pandas’_pandas 删除列
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/02
2.7K0
pandas’_pandas 删除列
3 个不常见但非常实用的Pandas 使用技巧
来源:DeepHub IMBA本文共1000字,建议阅读5分钟本文为你演示一些不常见,但是却非常有用的 Pandas 函数。 创建一个示例 DataFrame 。 import numpy as npimport pandas as pddf = pd.DataFrame({ "date": pd.date_range(start="2021-11-20", periods=100, freq="D"), "class": ["A","B","C","D"] * 25, "amount": np.
数据派THU
2022/05/27
1.4K0
3 个不常见但非常实用的Pandas 使用技巧
使用pandas筛选出指定列值所对应的行
该方法其实就是找出每一行中符合条件的真值(true value),如找出列A中所有值等于foo
星星在线
2020/05/22
19.4K0
pandas中的缺失值处理
在真实的数据中,往往会存在缺失的数据。pandas在设计之初,就考虑了这种缺失值的情况,默认情况下,大部分的计算函数都会自动忽略数据集中的缺失值,同时对于缺失值也提供了一些简单的填充和删除函数,常见的几种缺失值操作技巧如下
生信修炼手册
2020/07/14
2.7K0
JavaScript Date(日期) 对象
我们提供 JavaScript Date 对象参考手册,其中包括所有可用于日期对象的属性和方法。JavaScript Date 对象参考手册。
陈不成i
2021/07/20
1.3K0
JS前端Date(日期)
Date日期对象是一个构造函数,主要用来获取时间和对时间进行一系列操作。Date 类型将日期保存为自协调世界时(UTC,Universal Time Coordinated)时间 1970 年 1 月 1 日午夜(零时)至今所经过的毫秒数。
IT工作者
2022/05/13
10.4K0
获取GridView中的某列值
    protected void GridView1_RowEditing(object sen
Java架构师必看
2021/03/22
10.7K0
如何用Python获取两个日期之间的日期?
问:如何用Python获取两个日期之间的日期? def date_range(start, end): delta = end - start # as timedelta days = [start + timedelta(days=i) for i in range(delta.days + 1)] return days start_date = datetime(2020, 12, 1) end_date = datetime(2020, 12, 5) print(d
TalkPython
2020/12/11
5.9K0

相似问题

如果date在另一个Python pandas数据框中介于2个日期之间,则更新列

10

如果日期介于两个日期之间,则查找值

34

如果列标题介于两个日期之间,则返回值。

11

如果日期在pandas中的两个日期之间,则查找每个ID的值总和

25

Python与列中的常量之和(如果日期介于2个日期之间)

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档