Python 对跨多个年份记录在同一日历日期中的值进行排序
Posted
技术标签:
【中文标题】Python 对跨多个年份记录在同一日历日期中的值进行排序【英文标题】:Python sort values recorded in the same calendar date across multiple years 【发布时间】: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() 操作的更好方法是什么?日期“组”?
我确实检查了所有相关的以前的帖子,但似乎在这里找不到适合我的目的。如果有人能指出更好的方法,我将不胜感激。
谢谢。
【问题讨论】:
【参考方案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 个值,将它们映射到它们各自的日历日。谢谢。以上是关于Python 对跨多个年份记录在同一日历日期中的值进行排序的主要内容,如果未能解决你的问题,请参考以下文章