【问题标题】:Percentage of each day where sum is the total of each day value每天的百分比,其中 sum 是每天值的总和
【发布时间】:2019-07-19 12:35:00
【问题描述】:

我正在尝试获取给出总和的每一天的百分比。

我每天都有带有日期时间索引的数据,我使用方法 sum 类似于每年的索引,这是代码。

data_converted = data.resample('AS').sum() 

而我想要的是得到每天的百分比:

这就是我想做的事

percentage=[ (data[all_day_in_year2000] / data_converted[year2000] )*100 ]

注意到我的数据已经超过一年了

如果你认为我要求的太多了,你可以忽略这个:

如果我将每日数据类似于月度数据或季度数据,如果它是灵活的,那就太好了。

感谢您的考虑。

编辑

很抱歉没有发布我的数据

这是我的数据。

1986-01-02                                              25.56  
1986-01-03                                              26.00  
1986-01-06                                              26.53  
1986-01-07                                              25.85  
1986-01-08                                              25.87  
1986-01-09                                              26.03  
1986-01-10                                              25.65  
1986-01-13                                              25.08  
...                                                       ...  
2019-06-04                                              53.50  
2019-06-05                                              51.57  
2019-06-06                                              52.59  
2019-06-07                                              53.95  
2019-06-10                                              53.33  
2019-06-11                                              53.30 

当我使用 sum 重新采样时,我得到了以下结果。

1986-01-01     3776.97
1987-01-01     4876.93
1988-01-01     4103.11
1989-01-01     5046.32
1990-01-01     6303.33
1991-01-01     5514.59

我想要的是第一个相对于第二个的百分比。它也可以单独存储在列表中,没有日期时间:

                    #value in daily /value in yearly*100
1986-01-02          (25.56 / 3776.97)*100
1986-01-03          (26.00 / 3776.97)*100
1986-01-06          (26.53 / 3776.97)*100
1986-01-07          (25.85 / 3776.97)*100

明年类似:

1986-02-03          (17.42 / 4876.93)*100   

【问题讨论】:

  • 如果没有看到数据集的样本,就很难回答/可视化问题。你能发布数据吗?
  • 您能否为您的问题添加更多细节。
  • @GustavoGradvohl 抱歉现在没有添加我已经添加了,谢谢。

标签: python pandas dataframe datetime


【解决方案1】:

您可以将transformresample 一起使用,并根据transformsum 的结果在每日值之间进行计算

您的示例数据:(我只是抓取您发布的部分数据)

Out[11]:
              val
dates
1986-01-02  25.56
1986-01-03  26.00
1986-01-06  26.53
1986-01-07  25.85
1986-01-08  25.87
1986-01-09  26.03
1986-01-10  25.65
1986-01-13  25.08
2019-06-04  53.50
2019-06-05  51.57
2019-06-06  52.59
2019-06-07  53.95
2019-06-10  53.33
2019-06-11  53.30

df.val / df.resample('AS').val.transform('sum') * 100

Out[14]:
dates
1986-01-02    12.373530
1986-01-03    12.586532
1986-01-06    12.843104
1986-01-07    12.513918
1986-01-08    12.523600
1986-01-09    12.601055
1986-01-10    12.417098
1986-01-13    12.141163
2019-06-04    16.811212
2019-06-05    16.204751
2019-06-06    16.525264
2019-06-07    16.952614
2019-06-10    16.757793
2019-06-11    16.748366
Name: val, dtype: float64

【讨论】:

    【解决方案2】:

    我更喜欢使用 groupby,然后按组应用:

    by_year = data.groupby(pd.Grouper(freq='AS')) 
    percentage = by_year.apply(lambda x: x/x.sum() * 100)
    

    【讨论】:

      【解决方案3】:

      只需在这个答案中逐年替换,你就可以了:

      import numpy as np
      import pandas as pd
      
      df = pd.DataFrame({'a': pd.date_range('1986-01-01','1986-03-01',closed='left')})
      df['b'] = df.a.dt.month
      
      # this is the answer, just one liner
      df['answer']=df.b/df.groupby(df.a.dt.month).b.transform('sum')*100
      
      # just looking the sum, this is not required
      df['just_check_sum'] = df.groupby(df.a.dt.month).b.transform('sum')
      
      print(df.head())
                 a  b    answer  just_check_sum
      0 1986-01-01  1  3.225806              31 ===> 1/31*100 = 3.22 %
      1 1986-01-02  1  3.225806              31
      2 1986-01-03  1  3.225806              31
      3 1986-01-04  1  3.225806              31
      4 1986-01-05  1  3.225806              31
      

      【讨论】:

        猜你喜欢
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多