熊猫-计算每日百分比

时间:2019-02-08 12:33:34

标签: pandas pandas-groupby

我有以下问题:

2018-03-07 18:00:00    NW
2018-03-07 19:00:00    NW
2018-03-07 20:00:00    NW
2018-03-07 21:00:00     W
2018-03-07 22:00:00     W
2018-03-07 23:00:00     W
2018-03-08 00:00:00     W
2018-03-08 01:00:00    NW
2018-03-08 02:00:00    NW
2018-03-08 03:00:00    NW
2018-03-08 04:00:00    NW
2018-03-08 05:00:00    SW
2018-03-08 06:00:00    SE
2018-03-08 07:00:00    NE
2018-03-08 08:00:00     E
2018-03-08 09:00:00     W
2018-03-08 10:00:00     W
2018-03-08 11:00:00    NW

一个数据帧(dfWdir),其中包括总共360天的每小时时间戳记和该小时的平均风向作为标签。例如:N,NE,E,SE,S,SW,W,NW。 我现在想知道一天中有多少风向北或向其他方向吹。因此,最后一天的每个偏心加起来将达到100%。 EG:今天是2018年3月7日,20%的风来自NW方向和S方向的10%,依此类推。

通过以下代码,我得到了解决方案:

df2 = df.resample('D')['Wind'].value_counts()
df2.name = 'count_Wind'
df2 = df2.reset_index('Wind')

df3 = df2.resample('D')['count_Wind'].sum()
df2['percent'] = df2['count_Wind'].div(df3) * 100

final Dataframe

但是结果应显示在plot.area()图形中。因此,我需要为每个时间步的每个可能的风向列。此列中每个时间步的百分比。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

Date作为索引,resample按天并计算Wind的唯一值

import pandas as pd

df = pd.DataFrame({
    'Date' : [
        '2018-03-07 18:00:00',
        '2018-03-07 19:00:00',
        '2018-03-07 20:00:00',
        '2018-03-07 21:00:00',
        '2018-03-07 22:00:00',
        '2018-03-07 23:00:00',
        '2018-03-08 00:00:00',
        '2018-03-08 01:00:00',
        '2018-03-08 02:00:00'
    ],
    'Wind' : ['NW','NW','NW','W','W','W','W','NW','NW']})

df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

df2 = df.resample('D')['Wind'].value_counts()
df2.name = 'count_Wind'
df2 = df2.reset_index('Wind')

df3 = df2.resample('D')['count_Wind'].sum()
df2['percent'] = df2['count_Wind'].div(df3) * 100

结果:

df2.head()


            Wind    count_Wind  percent
Date            
2018-03-07  NW  3   50.000000
2018-03-07  W   3   50.000000
2018-03-08  NW  2   66.666667
2018-03-08  W   1   33.333333

如果您不需要count_Wind,请使用del df2['count_Wind']

答案 1 :(得分:0)

创建两个groupby对象。一个计算一天的风,第二个计算每天的风。然后,您可以在日间使用div方法来获取答案。

import datetime
df = pd.DataFrame.from_dict({
    'Date' : [
        '2018-03-07 18:00:00',
        '2018-03-07 19:00:00',
        '2018-03-07 20:00:00',
        '2018-03-07 21:00:00',
        '2018-03-07 22:00:00',
        '2018-03-07 23:00:00',
        '2018-03-08 00:00:00',
        '2018-03-08 01:00:00',
        '2018-03-08 02:00:00'
    ],
    'Wind' : ['NW','NW','NW','W','W','W','W','NW','NW']} )

df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S',)

    Date              Wind
0   2018-03-07 18:00:00 NW
1   2018-03-07 19:00:00 NW
2   2018-03-07 20:00:00 NW
3   2018-03-07 21:00:00 W
4   2018-03-07 22:00:00 W
5   2018-03-07 23:00:00 W
6   2018-03-08 00:00:00 W
7   2018-03-08 01:00:00 NW
8   2018-03-08 02:00:00 NW 

# split datetime into day and time

df['Day'] = [d.date() for d in df['Date']]
df['Time'] = [d.time() for d in df['Date']]


# groupby Day and Wind,, then group on day, then divide 

day_wind = df.groupby(['Day', 'Wind']).agg({'Time': 'count'})
day_total = df.groupby(['Day']).agg({'Time': 'count'})
day_wind.div(day_total, level='Day').round(3) * 100

Output: 
               Time
Day        Wind 
2018-03-07  NW  50.0
             W  50.0
2018-03-08  NW  66.7
             W  33.3

答案 2 :(得分:0)

我不确定您的结果应该是什么样子,并假设DataFrame的列为DateDirection

您可以通过以下方式获取每天的风向绝对值:

df.groupby([df.Date.dt.floor('D'), 'Direction'])['Direction'].agg(len).unstack().fillna(0)

数据集中每天的小时数:

df.groupby([df.Date.dt.floor('D')])['Date'].agg(len)

将其组合会得出相对值。