J'ai donc un ensemble de données avec des températures de 1952 à 2017. Je dois calculer séparément les températures mensuelles moyennes par an.
Ensemble de données: https://drive.google.com/file/d/ 1_RZPLaXoKydjjgm4ghkwtbOGWKC4-Ssc / view? Usp = sharing
means_year_month = np.zeros(780) index = 0 for â¦.
L'impression des cinq premières lignes des données donne ce qui suit: (le premier est la date, que les précipitations, tavg (température moyenne ), tmax et tmin)
means_years = np.zeros(65) index = 0 for year_now in np.unique(year): means_years[index] = tmax_clean[(year == year_now) & (year < '2017')].mean() index = index+1
Ici, je supprime les valeurs nan et les données manquantes de tavg:
means_months = np.zeros(12) index = 0 for month_now in np.unique(month): means_months[index] = tmax_clean[(month == month_now) & (year < '2017')].mean() index = index + 1
Conversion les en int et en chaîne à nouveau pour supprimer le 'YYYYMMDD.0' et obtenir 'YYYYMMDD'
['1952' '1952' '1952' ... '2017' '2017' '2017'] ['01' '01' '01' ... '10' '10' '10'] ['01' '02' '03' ... '01' '02' '04']
L'impression date_clean_str donne ce qui suit:
year = [datenow[0:4] for datenow in date_clean_str] year = np.array(year) month = [d[4:6] for d in date_clean_str] month = np.array(month) day = [datenow[6:8] for datenow in date_clean_str] day = np.array(day)
3 Réponses :
b=pd.read_csv('b.dat') b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p') b.index=b['date'] b.index.month # will give you indexes of months (can access the month like this) df.groupby(by=[b.index.month]) or year or day and then calcu;late the average simple.Did you try this ? this is fast and efficient way.
Je le ferai, mais puis-je calculer la moyenne mensuelle pour chaque année pour aboutir à 780 valeurs pour 12 mois par 65 ans. Pour avoir la moyenne mensuelle pour janvier 1952, février 1952,…, octobre 1978,… jusqu'en décembre 2016.
Chaque base d'horodatage (mois, année ou jour) crée d'abord un groupe par fonction ou manuellement avec votre code, par exemple, j'ai pris ou regroupé tous les enregistrements pendant un mois. De cette façon, j'aurai 12 x 65 = 780 groupes, après cela juste une seule ligne pour la moyenne et vous aurez 780 valeurs. même chose pour les autres granularités d'horodatage.
Veuillez formater le code - sélectionnez-le et tapez ctrl-k
. Mise en forme des articles ... Aide au formatage a >
Peut-être en utilisant pandas.read_fwf ( )
fonctionne mieux.
year | num_records | avg TMIN | avg TMAX 1952 | 240 | 32.5 | 48.0 1953 | 255 | 35.9 | 50.9 1954 | 246 | 36.4 | 49.7 1955 | 265 | 31.2 | 46.4 1956 | 260 | 31.0 | 47.1 ... period | num_records | avg TMIN | avg TMAX 1952-01 | 10 | 27.5 | 35.1 1952-02 | 18 | 17.2 | 28.8 1952-03 | 20 | -1.1 | 25.6 1952-04 | 23 | 30.1 | 49.7 1952-05 | 21 | 33.6 | 52.9 ...
Le résultat est:
import pandas as pd df = pd.read_fwf('1091402.txt') df.index = pd.to_datetime(df['DATE'], format='%Y%m%d') df = df[['TMIN', 'TMAX']] df = df[df['TMIN'] != -9999][df['TMAX'] != -9999] print(df.shape) # print(df) print() print('{:7s} | {:12s} | {:12s} | {:12s}'.format( 'year', 'num_records', 'avg TMIN', 'avg TMAX')) for key, sub_df in df.groupby(df.index.year): print('{:7d} | {:12d} | {:12.1f} | {:12.1f}'.format( key, sub_df.shape[0], sub_df['TMIN'].mean(), sub_df['TMAX'].mean())) print() print('{:7s} | {:12s} | {:12s} | {:12s}'.format( 'period', 'num_records', 'avg TMIN', 'avg TMAX')) for key, sub_df in df.groupby([df.index.year, df.index.month]): print('{:4d}-{:02d} | {:12d} | {:12.1f} | {:12.1f}'.format( key[0], key[1], sub_df.shape[0], sub_df['TMIN'].mean(), sub_df['TMAX'].mean()))
Si vous créez des objets datetime des dates puis définissez la colonne datetime comme index, la fonctionnalité de date et d'heure de pandas peut faciliter la tâche.
Je ne suis pas sûr que j'utiliserais numpy pour le regroupement, mais il semble que vous soyez d'accord avec les pandas. Voici comment procéder:
Out[1]: TAVG TMAX TMIN mean median mean median mean median year month 1952 1 29.478261 29.0 32.608696 30.0 28.434783 28.0 2 24.800000 26.0 29.000000 28.0 18.400000 19.0 3 13.807692 10.5 26.423077 25.0 1.230769 -4.0 4 39.607143 38.0 49.035714 48.0 30.285714 30.0 5 44.666667 44.0 52.555556 54.0 33.629630 34.0
Résultats:
import pandas as pd import datetime as dt # This command is executed in shell due to '!' sign. # It replaces all extra whitespaces with single one. !cat 1091402.txt | sed 's/ \{1,\}/ /g' > 1091402_trimmed.txt df = pd.read_csv('1091402_trimmed.txt', sep=' ') # Omit line with hyphens df = df[1:] # Parse datetime df['date'] = pd.to_datetime(df['DATE']) # Extract year and month df['year'] = df['date'].apply(lambda x: x.year) df['month'] = df['date'].apply(lambda x: x.month) for column in ('TMAX', 'TMIN', 'TAVG'): # Set N/A for -9999 values df[column].replace('-9999', None, inplace=True) # Cast all columns to int df[column] = df[column].astype('int64') # Grouping df.groupby(['year', 'month']).agg({ 'TAVG': ['mean', 'median'], 'TMAX': ['mean', 'median'], 'TMIN': ['mean', 'median'], }).head()
Pouvez-vous inclure quelques exemples minimaux de
tmax_clean
,année
mois
,jour
,date_clean_str
- peut-être quelques lignes chacun? Peut-être même 10 à 20 lignes dedonnées
. Utilisez-vous aussi Pandas?vous pouvez ajouter une nouvelle colonne contenant l'année et le groupe par cette colonne; ou vous pouvez ajouter une colonne avec AAAAMM pour regrouper par mois et par année.
Exemples minimes inclus. Faites-moi savoir si cela suffit. Quant à @Ralf, je ne comprends pas tout à fait.