3
votes

Comment calculer séparément les températures mensuelles moyennes par an en utilisant numpy?

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 commentaires

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 de donné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.


3 Réponses :


2
votes
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.

3 commentaires

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



0
votes

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()))


1 commentaires

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.



0
votes

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()


0 commentaires