我有以下问题:
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
但是结果应显示在plot.area()图形中。因此,我需要为每个时间步的每个可能的风向列。此列中每个时间步的百分比。
感谢您的帮助!
答案 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的列为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)
将其组合会得出相对值。