Python排序值在多年内记录在同一日历日期中

时间:2017-03-18 10:52:53

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

我正在处理一个数据框,其中包含多年时间跨度记录的每日值,如

   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

什么是更好的方法来进行这样的groupby()操作,假设我想保持余地,对每个日历中的值进行一些简单的计算(例如,max(),min(),mean())日期“小组”?

我确实检查过所有相关的帖子,但似乎无法找到适合我的目的。如果有人能指出更好的方法,我将非常感激。

谢谢。

2 个答案:

答案 0 :(得分: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])

现在使用我们现在在df中的结果索引df2重新索引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

@echo off
if "%~1" == "" goto :EOF
for %%I in ("%~1\*.tex") do C:\python27\python.exe "%~dp0tools\textool.py" -x -v -ra "%%~fI"

答案 1 :(得分:0)

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