如何用pandas实现基于日期连续性的列差值计算?
使用Pandas实现日期连续时的权重差值计算
嘿,这个需求很明确,我们可以通过几步简单的Pandas操作来实现,我给你一步步拆解:
1. 先构造测试用的原始数据
首先我们先把你给出的DataFrame用代码构造出来,方便后续测试:
import pandas as pd import numpy as np data = { 'weight': [43, 30, 45, 25, 35, 39], 'Date': ['09/03/2018 08:48:48', '10/03/2018 23:28:48', '12/03/2018 04:21:44', '17/03/2018 00:23:32', '18/03/2018 04:49:01', '19/03/2018 20:14:37'], 'dateDay': ['09/03/2018', '10/03/2018', '12/03/2018', '17/03/2018', '18/03/2018', '19/03/2018'] } df = pd.DataFrame(data)
2. 转换日期列格式
原始的dateDay是字符串类型,没法直接做日期运算,所以先把它转换成datetime类型:
df['dateDay'] = pd.to_datetime(df['dateDay'], format='%d/%m/%Y')
这里的format='%d/%m/%Y'是匹配你数据里的日/月/年格式,确保转换不会出错。
3. 判断日期是否连续
我们需要获取每一行的上一行日期,然后计算两者的天数差,以此判断是否是次日:
# 获取上一行的日期 df['prev_date'] = df['dateDay'].shift(1) # 计算当前日期与上一行日期的天数差 df['day_diff'] = (df['dateDay'] - df['prev_date']).dt.days
shift(1)函数会把列数据整体下移一行,这样每一行就能拿到上一行的日期值;dt.days则是把日期差转换成具体的天数数值。
4. 计算目标列Fun_Cum
根据你的规则:如果日期差是1天(即次日),就用当前weight减去上一行的weight,否则设为NULL(对应Pandas里的NaN缺失值):
# 用np.where实现条件判断赋值 df['Fun_Cum'] = np.where(df['day_diff'] == 1, df['weight'] - df['weight'].shift(1), np.nan)
5. 整理最终结果
最后我们可以删掉中间用的辅助列,并把NaN替换成字符串'NULL',让结果和你期望的完全一致:
# 删除辅助列 df = df.drop(['prev_date', 'day_diff'], axis=1) # 将NaN替换为NULL df['Fun_Cum'] = df['Fun_Cum'].replace({np.nan: 'NULL'})
现在你打印df就能得到和示例完全一样的结果啦!
内容的提问来源于stack exchange,提问作者Data Scientist
相关产品推荐
相关产品推荐

