Панды - Рассчитать дневной процент - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть следующая проблема:

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

A Dataframe (dfWdir), который включает в себя часовую метку времени в общей сложности 360 дней и среднее направление ветра в этом часе в качестве метки.Например: N, NE, E, SE, S, SW, W, NW.Теперь я хочу знать, сколько времени в течение дня дует ветер в северном или любом другом направлении.Таким образом, в конце каждый день прецедента будет составлять до 100%.EG: У нас есть день 2018-03-07, и 20% ветра дует с северо-западного направления, 10% направления S. и т. Д.

По следующему коду я получаю решение:

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 голосов
/ 08 февраля 2019

С Date в качестве индекса, повторная выборка по дням и число 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']

0 голосов
/ 08 февраля 2019

Я не уверен, как должен выглядеть ваш результат, и предполагаю, что столбцы DataFrame равны Date и Direction.

. Вы получаете абсолютные значения для направления ветра на каждый день.по:

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

Количество часов в день в вашем наборе данных:

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

Сочетание этого приводит к относительным значениям.

0 голосов
/ 08 февраля 2019

Создание двух групповых объектов.Один подсчитывает ветер по дням, а второй подсчитывает общий ветер по дням.Затем вы можете использовать метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...