【问题标题】:Sum the value of a dictionary based on the difference between two columns in a dataframe and divide the first column by two - Python根据数据框中两列之间的差异对字典的值求和,并将第一列除以二 - Python
【发布时间】:2020-04-04 12:31:28
【问题描述】:

我有一个数据框和一个字典

 Start_date     End_Date

1 2019-01-16    2019-05-28  
2 2018-06-05    2018-07-31  
3 2019-02-11    2019-04-14  
{'HDD': {'2015-01': 477.6,
  '2016-01': 429.0,
  '2017-01': 593.8,
  '2018-01': 372.1,
  '2019-01': 502.8,
  '2015-02': 457.4,
  '2016-02': 377.6,
  '2017-02': 369.8,
  '2018-02': 469.8,
  '2019-02': 395.5,
  '2015-03': 325.2,
  '2016-03': 370.8,
  '2017-03': 266.1,
  '2018-03': 392.9,
  '2019-03': 297.3,
  '2015-05': 24.2,
  '2016-05': 97.4,
  '2017-05': 88.5,
  '2018-05': 41.4,
  '2019-05': 118.1,
  '2015-06': 0.0,
  '2016-06': 0.0,
  '2017-06': 0.0,}}

输出 crate 一个新的列值,它是字典值的总和(计算开始日期和结束日期之间的月份)。

 Start_date     End_Date    Value

1 2019-01-16    2019-05-28  760
2 2018-06-05    2018-07-31  803
3 2019-02-11    2019-04-14  200

问题就在这里--> 如果 start_date 的日期高于 15,我想将 start_date 月份的 HDD 值除以 2,如果 end_date 的日期低于 28,则将 end_date 的值除以. 两个日期之间的值不会被2除,只有start/end_date的月份的值。 我的代码适用于一部分,它可以将 end_date 除以 2,但对于 start_date,它需要 HDD 的整个值。

from datetime import datetime, date, time
import calendar
def get_sum_values(start_date, end_date, dictionary,start_middle=15, end_middle=28):
    tot= 0
    j = 1
    i=1
    difference = (end_date.year - start_date.year) * 12 + (end_date.month - start_date.month)
    for key in dictionary['HDD'].keys():
        if datetime.strptime(key, '%Y-%m')>=start_date and datetime.strptime(key, '%Y-%m')<=end_date:
            if (i==0 and start_date.day >= start_middle ) or (j==end_date.month and end_date.day<=end_middle):
                tot+=dictionary['HDD'][key]/2
            else:
                tot+=dictionary['HDD'][key]
        #if start_date.dt.day <= start_middle or end_date.dt.day>=end_middle:
                #-dictionary['HDD'][key][end_date]/2
            i+=1
            j+=1
    return tot

gaz['HDD'] = gaz.apply(lambda row: get_sum_values(row['Start_Date'], row['End_Date'],hdd_dict), axis=1)

我希望它很清楚。 非常感谢您的帮助:)。

【问题讨论】:

  • 嘿布鲁诺,我尝试了不同的方法,但不幸的是它不起作用@Bruno Mello

标签: python pandas date datetime dat-protocol


【解决方案1】:

如果你的数据不是太大,你可以使用apply这个:

lookup = pd.DataFrame(d)
lookup.index=pd.to_datetime(lookup.index).to_period('M')

df['Value'] = df.apply(lambda x: lookup.loc[x['Start_date']: x['End_Date'], 'HDD'].sum(), axis=1)

输出:

  Start_date   End_Date   Value
1 2019-01-16 2019-05-28  1313.7
2 2018-06-05 2018-07-31     0.0
3 2019-02-11 2019-04-14   692.8

【讨论】:

  • 不幸的是,数据框很大:(。问题是,如果它大于 15(天)或小于 15,如果它的 end_date,我只需将第一个月和最后一个月除以 2
  • 它有多大? df 中的几百万行最多需要几秒钟。
  • 这段代码是不是除以2,如果当天是15以上的第一个日期的HDD值?我试过了,它给了我和我一样的东西。感谢您的帮助
  • 不,它没有。有空会修改。
  • 非常感谢!我真的很感激:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2022-01-17
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多