【问题标题】:Python sort values recorded in the same calendar date across multiple yearsPython 对跨多个年份记录在同一日历日期中的值进行排序
【发布时间】:2017-08-09 22:45:02
【问题描述】:

我正在研究一个数据框,其中包含像这样在多年时间跨度内记录的每日值

   Date    Position  Value
2010-01-01 PEAK      60
2010-01-01 BOTTOM    51
2010-01-02 PEAK      62
2010-01-02 BOTTOM    50
...
2011-01-01 PEAK      70
2011-01-01 BOTTOM    61
2011-01-02 PEAK      72
2011-01-02 BOTTOM    60
...
2015-12-31 PEAK      92
2015-12-31 BOTTOM    83

也就是说,对应于每个日历日期的行条目连续重复 6 年,不考虑闰年(即 2 月 29 日),我想按日历日期对它们进行分组,无论年份如何,如下格式

       Date    Position  Value
    2010-01-01 PEAK      60
    2010-01-01 BOTTOM    51
    2011-01-01 PEAK      63
    2011-01-01 BOTTOM    57
    ...
    2015-01-01 PEAK      84
    2015-01-01 BOTTOM    71
    ...
    2014-12-31 PEAK      85
    2014-12-31 BOTTOM    79
    2015-12-31 PEAK      92
    2015-12-31 BOTTOM    83

如果我想保留对每个日历中的值进行一些简单计算(例如,max()、min()、mean())的余地,那么执行这种 groupby() 操作的更好方法是什么?日期“组”?

我确实检查了所有相关的以前的帖子,但似乎在这里找不到适合我的目的。如果有人能指出更好的方法,我将不胜感激。

谢谢。

【问题讨论】:

    标签: python date pandas group-by time-series


    【解决方案1】:

    您有一个排序问题要解决。一种方法是使用中间数据帧:

    df2 = pd.DataFrame([df.Date.dt.month, df.Date.dt.day]).T
    
    df2.columns = [0,1]
    
    df2
    Out[32]: 
        0   1
    0   1   1
    1   1   1
    2   1   2
    3   1   2
    4   1   1
    5   1   1
    6   1   2
    7   1   2
    8  12  31
    9  12  31
    
    df2 = df2.sort_values([0,1])
    

    现在用 df2 中的结果索引重新索引 df

    df.reindex(df2.index)
    Out[36]: 
            Date Position  Value
    0 2010-01-01     PEAK     60
    1 2010-01-01   BOTTOM     51
    4 2011-01-01     PEAK     70
    5 2011-01-01   BOTTOM     61
    2 2010-01-02     PEAK     62
    3 2010-01-02   BOTTOM     50
    6 2011-01-02     PEAK     72
    7 2011-01-02   BOTTOM     60
    8 2015-12-31     PEAK     92
    9 2015-12-31   BOTTOM     83
    

    【讨论】:

    • 非常感谢。这比我得到的要整洁得多。我会再试一次!
    【解决方案2】:

    IIUC 你可以这样做:

    In [2]: df
    Out[2]:
            Date Position  Value
    0 2010-01-01     PEAK     60
    1 2010-01-01   BOTTOM     51
    2 2010-01-02     PEAK     62
    3 2010-01-02   BOTTOM     50
    4 2011-01-01     PEAK     70
    5 2011-01-01   BOTTOM     61
    6 2011-01-02     PEAK     72
    7 2011-01-02   BOTTOM     60
    8 2015-12-31     PEAK     92
    9 2015-12-31   BOTTOM     83
    
    In [3]: df.groupby([df.Date.dt.month, df.Date.dt.day, 'Position']).agg(['min','mean','max','sum'])
    Out[3]:
                       Value
                         min mean max  sum
    Date Date Position
    1    1    BOTTOM      51   56  61  112
              PEAK        60   65  70  130
         2    BOTTOM      50   55  60  110
              PEAK        62   67  72  134
    12   31   BOTTOM      83   83  83   83
              PEAK        92   92  92   92
    

    【讨论】:

    • 它有效。我尝试了您的方法并将值转换为列表。我现在正在绘制这些 365 个值,将它们映射到它们各自的日历日。谢谢。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 2017-05-26
    • 2017-05-08
    • 1970-01-01
    • 2021-07-09
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多