Процент временных рядов в определенном диапазоне по дням - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть большой набор данных временного ряда, который измеряет температуру во времени.Каждый ряд имеет дату-время и соответствующую температуру.Я хочу выяснить процент времени, когда он находится в определенном температурном диапазоне.

Я хотел бы просмотреть этот фрейм данных и для каждого дня вычислять процент температур, которые находятся между 10 и 20 градусами.Это должно привести к созданию нового фрейма данных, в котором для каждого дня будет указан процент, в котором находилось устройство.Смысл в том, чтобы увидеть, как процент в диапазоне изменяется по дням, а не просто вычислять процент в диапазоне для всего фрейма данных.

Как я могу добиться этого более эффективным способом, чем я пытался?

df1 = df[(df['date'] > '2019-01-01') & (df['date'] <= '2019-01-02')]
df2 = df[(df['date'] > '2019-01-02') & (df['date'] <= '2019-01-03')]
df3 = df[(df['date'] > '2019-01-03') & (df['date'] <= '2019-01-04')]
df4 = df[(df['date'] > '2019-01-04') & (df['date'] <= '2019-01-05')]
df5 = df[(df['date'] > '2019-01-05') & (df['date'] <= '2019-01-06')]
df6 = df[(df['date'] > '2019-01-06') & (df['date'] <= '2019-01-07')]
df7 = df[(df['date'] > '2019-01-07') & (df['date'] <= '2019-01-08')]

condition1 = df1[(df1.temp >= 10.0) & (df1.temp <=20.0)]
condition2 = df2[(df2.temp >= 10.0) & (df2.temp <=20.0)]
condition3 = df3[(df3.temp >= 10.0) & (df3.temp <=20.0)]
condition4 = df4[(df4.temp >= 10.0) & (df4.temp <=20.0)]
condition5 = df5[(df5.temp >= 10.0) & (df5.temp <=20.0)]
condition6 = df6[(df6.temp >= 10.0) & (df6.temp <=20.0)]
condition7 = df7[(df7.temp >= 10.0) & (df7.temp <=20.0)]

percentage1 = (len(condition1)/len(df1))*100
percentage2 = (len(condition2)/len(df2))*100
percentage3 = (len(condition3)/len(df3))*100
percentage4 = (len(condition4)/len(df4))*100
percentage5 = (len(condition5)/len(df5))*100
percentage6 = (len(condition6)/len(df6))*100
percentage7 = (len(condition7)/len(df7))*100

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

что-то вроде этого может работать для вас:

df['date']=pd.to_datetime(df['date']) #not necessary if your dates are already in datetime format
df.set_index('date',inplace=True) #make date the index

all_days=df.index.normalize().unique() #get all unique days in timeseries

df2=pd.DataFrame(columns=['date','percent']) #create new df to store results
df2['date']=all_days #make date column equal to the unique days
df2.set_index('date',inplace=True) #make date column the index

for i,row in df2.iterrows(): #iterate through each row of df2
    iloc = df2.index.get_loc(i) #get index location
    daily_df = df[(df.index >= df2.index[iloc]) & (df.index < df2.index[iloc+1])] #get reduced df for that day (assuming it starts at midnight and ends at 23:59:59)
    total_count = daily_df.shape[0] #number of temp readings that day
    above_count = daily_df[(daily_df['temp'] >= 10) & (daily_df['temp'] <= 20)].values.shape[0] #number of temp readings between 10 and 20
    df2.iloc[iloc]['percent']=100*above_count/total_count #assign percent column the percentage of values between 10 and 20 

определенно есть способ свести код с помощью функций панд, о которых я не знаю ... но это хорошее начало

вам придется обрабатывать последний день, так как у него не будет конечного конечного дня

РЕДАКТИРОВАТЬ

заменить строку daily_df на:

daily_df = df[df.index.normalize() == df2.index[iloc]]

и не будетпадение в последний день

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

При условии, что у вас есть одинаковые данные, вы можете попробовать это:

df2 = df[(df['temperature']>10)&(df['temperature']<20)]['temperature'].resample('1d').count().divide(df['temperature'].resample('1d').count())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...