比较熊猫中不同年份的同一天

时间:2017-05-16 11:04:34

标签: python python-3.x date pandas

我是一个新手还在试图找出熊猫 - 分裂/应用/组合只是开始有意义但我还没有。

我试图从前几年(2013-2015)的同一天获得历史高点和低点的销售电话号码,然后又有一列告诉我2016年的电话会话比以前的高点更高或低于之前的低点以及价值观。

这是我到目前为止的尝试:

df = pd.read_csv('filename.csv')
df['Date']  = pd.to_datetime(df['Date'])
df = df[(df['Date']>= '01/01/2013') & (df['Date'] <= '12/31/2015')]
df['Month']     = df.Date.dt.month
df['Day']   = df.Date.dt.day

dfMAX = df[df['Element'] == "MAX"]
dfMAX = (dfMAX.groupby([dfMAX.Date.dt.month, dfMAX.Date.dt.day, 'Element'])
            [['Data_Value']]
            .agg(['max']))

这让我获得了每天的最大值,我知道我可以为最小值重复这个。我很难知道如何将它与多指数重新组合,然后如何获得高于或低于已记录的最小值/最大值的2016年值。

我并不担心闰年数据,因此可以放弃/忽略2月29日。

输出将是这样的:

Day of Year   Min   Max     2016
    1/1       50   1900     
    1/2       23   2100     2102
    1/3       90   1800      85
    1/4       89   1750
    1/5       50   2309      45
    1/6       44   5600     5649

我在这里发布了一个csv文件: https://drive.google.com/open?id=0B4xdnV0LFZI1dUE3ZFBxdWFQOGc

感谢您的帮助, 我

1 个答案:

答案 0 :(得分:3)

我会按照以下步骤解决这个问题:

  1. 确保日期是日期时间列dtype。然后,创建一个新列 在您的数据框中使用.dt.dayofyear
  2. 调用Day_Of_Year
  3. 将您的数据框架拆分为两个数据框架,一个是2013年到2015年 2016。
  4. 使用2013年至2015年的数据框,并将groupby.agg一起使用 最小值和最大值,以获得2013年至2015年的最小值和最大值,以创建一个 数据帧每日记录。
  5. 接下来将此新的每日记录数据框与2016年数据框合并 使用pd.merge,您可以在2016年设置索引和 使用left_index=Trueright_index=True合并索引。
  6. 最后,我会使用布尔索引来仅选择那些 2016年值超出最小值或最大值的记录 合并数据框中的列。
  7. 你应该用你的数据得到这样的东西:

               min   max       Date Element  Value
    DayofYear                                     
    1          545  1812 2016-01-01     MAX   1887
    3          108  1815 2016-01-03     MAX   1906
    4          496  1618 2016-01-04     MAX   1701
    6          455  1864 2016-01-06     MIN    169
    8          511  1771 2016-01-08     MIN    232
    

    请在下方看到我的剧透代码。

      

    df = pd.read_csv(&#39; Downloads / Day_Over_Day.csv&#39;,parse_dates = [&#39; Date&#39;])
     1. df [&#39; DayofYear&#39;] = df [&#39; Date&#39;]。dt.dayofyear
     2A。 df_13_15 = df.query(&#39;日期&lt;&#34; 2016-01-01&#34;&#39;)
     2B。 df_2016 = df.query(&#39;日期&gt; =&#34; 2016-01-01&#34;&#39;)
     3.&amp; 4. df_Overlay = pd.merge(df_13_15.groupby(&#39; DayofYear&#39;)[&#39;价值&#39;]。agg([&#39; min&#39;,&#39; max&# 39;]),df_2016.set_index(&#39; DayofYear&#39;),left_index = True,right_index = True)
     5. print(df_Overlay [(df_Overlay [&#39; Value&#39;]&lt; df_Overlay [&#39; min&#39;])|(df_Overlay [&#39; Value&#39;]&gt; df_Overlay [& #39;最大&#39;])]头())