2014-01-07 3 views
4

Я пытаюсь использовать панды для вычисления ежедневной климатологии. Мой код:Вычислить ежедневную климатологию с использованием pandas python

import pandas as pd 

dates  = pd.date_range('1950-01-01', '1953-12-31', freq='D') 
rand_data = [int(1000*random.random()) for i in xrange(len(dates))] 
cum_data = pd.Series(rand_data, index=dates) 
cum_data.to_csv('test.csv', sep="\t") 

cum_data является кадр данных, содержащий ежедневные даты с 1 Jan 1950 по 31 декабря 1953 года я хочу создать новый вектор длиной 365 с первым элементом, содержащим среднее rand_data на 1 января за 1950, 1951, 1952 и 1953. И так далее для второго элемента ...

Любые предложения, как я могу это сделать, используя панды?

ответ

5

Вы можете GroupBy день года, и вычислить среднее для этих групп:

cum_data.groupby(cum_data.index.dayofyear).mean() 

Однако, у вас есть быть в курсе високосных лет. Это вызовет проблемы с этим подходом. В качестве альтернативы вы также можете сгруппировать по месяцам и дням:

In [13]: cum_data.groupby([cum_data.index.month, cum_data.index.day]).mean() 
Out[13]: 
1 1  462.25 
    2  631.00 
    3  615.50 
    4  496.00 
... 
12 28 378.25 
    29 427.75 
    30 528.50 
    31 678.50 
Length: 366, dtype: float64 
+0

спасибо! это прекрасно работает – user308827

1

@joris. Благодарю. Ваш ответ был именно тем, что мне нужно было использовать панды для расчета ежедневных климатологий, но вы остановились до последнего шага. Повторное отображение индекса месяца, дня назад к индексу дня года на все годы, включая високосные годы, то есть от 1 до 366. Поэтому я решил поделиться своим решением с другими пользователями. С 1950 по 1953 год составляет 4 года с одним високосным годом, 1952. Обратите внимание, что при использовании случайных значений каждый прогон даст разные результаты.

... 
from datetime import date 
doy = [] 
doy_mean = [] 
doy_size = [] 
for name, group in cum_data.groupby([cum_data.index.month, cum_data.index.day]): 
    (mo, dy) = name 
    # Note: can use any leap year here. 
    yrday = (date(1952, mo, dy)).timetuple().tm_yday 
    doy.append(yrday) 
    doy_mean.append(group.mean()) 
    doy_size.append(group.count()) 
    # Note: useful climatology stats are also available via group.describe() returned as dict 
    #desc = group.describe() 
    # desc["mean"], desc["min"], desc["max"], std,quartiles, etc. 

# we lose the counts here. 
new_cum_data = pd.Series(doy_mean, index=doy) 
print new_cum_data.ix[366] 
>> 634.5 

pd_dict = {} 
pd_dict["mean"] = doy_mean 
pd_dict["size"] = doy_size 
cum_data_df = pd.DataFrame(data=pd_dict, index=doy) 

print cum_data_df.ix[366] 
>> mean 634.5 
>> size  4.0 
>> Name: 366, dtype: float64 
# and just to check Feb 29 
print cum_data_df.ix[60] 
>> mean 343 
>> size  1 
>> Name: 60, dtype: float64 
Смежные вопросы