0
votes

SQL: Comment avez-vous des données moyennes sur une base mensuelle tout en référençant des mois à partir d'une année donnée?

Je travaille sur un projet pour l'une de mes classes de Python et j'essaie de saisir une chute de neige mensuelle moyenne pendant une année donnée. Dans mon ensemble de données, les données collectées entre 2016 à 2017 pour de nombreux avant-postes météo différents.

Ceci est simplement pour nettoyer certains fichiers météo .csv fichiers avec SQLite. J'ai réussi à obtenir les données, traditionnellement au format CSV, dans un format SQLite en mémoire, mais mon SQL est rouillé et je ne peux pas obtenir les données à appeler comme je le souhaite. J'ai parcouru à travers, essayé de séparer les données avec un lorsque la date avant de regrouper la date, mais je ne peux même pas obtenir les données à séparer avec les dates (éventuellement un problème avec comment SQL look Pour les dates et comment mes dates sont perforées, qui ressemble à 12/24/2017 code>). P>

Voici ce que j'essaie d'exécuter P>

Jan = cur.execute("SELECT STATION, NAME, DATE, AWND, AVG(SNOW) FROM t WHERE (DATE > '2016-01-01' AND DATE < '2016-02-01') GROUP BY STATION")


0 commentaires

3 Réponses :


0
votes
SELECT 
 t.*
FROM (
  SELECT 
      STATION
    , MIN(DATE) AS min_date
    , AVG(AWND) AS avg_awnd
    , AVG(SNOW) AS avg_snow
  FROM 
   t
  WHERE
   DATE < '1/1/17'
  GROUP BY 
    STATION
) AS t_aggregated
INNER JOIN
 t 
ON
   t_aggregated.STATION = t.STATION
 AND
   t_aggregated.min_date = t.date

2 commentaires

Désolé de vous confondre avec le min (date) et avg (AWND), je n'ai pas besoin de celles-ci. Ce que je cherche à faire est simplement de prendre ma table actuelle avec tous les éléments sélectionnés et de les mettre d'une manière où leurs moyennes menstruelles sont présentées pour une année donnée. J'ai mis à jour ma question, vous voudrez peut-être examiner la modification de la façon dont je cherche à y aller maintenant.


"Désolé de vous confondre avec le min (date) et avg (AWND), je n'ai pas besoin de ces" dans ce cas, la requête est plus difficile à résoudre @samdevito, je vous suggère de lire Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une requête SQL très simple? pour fournir des données d'exemple et des résultats attendus. Le SQLFiddle One a un moteur SQLite (basé sur le navigateur).



0
votes

est-ce ce que vous voulez? XXX

Vous pouvez ajouter un où la clause pour limiter les données à une période donnée. Par exemple, pour 2016: xxx


5 commentaires

Oui, c'est très proche de ce que je cherche, mais j'espérais de la délimiter jusqu'en 2016, puis tous les mois signalent la moyenne des chutes de neige. J'ai quelque chose près de mon code maintenant, mais je ne peux pas obtenir le SQL d'appeler la moyenne d'un mois sans que tout soit appelé. Pourrait faire un nouveau poste ici bientôt, va le lier ici si et quand je le fais


Je n'ai pas eu à StrfTime comme vous l'avez fait, tout comme une note. Je viens d'appeler le lieu où et il semblait travailler. Je pourrais essayer d'utiliser la Strftime et de voir si cela corrige la question de tout être écrasé


@Samdevito. . . Y a-t-il une raison pour laquelle vous avez accepté cette réponse?


Ce n'était pas faux ou quoi que ce soit. C'était une réponse que je cherchais, mais j'ai répondu à ma propre question, c'est pourquoi j'ai choisi la mienne comme la réponse. Ma réponse s'intègre vraiment dans la niche de la question, obtenant des moyennes pour chaque mois de l'année puis l'imprimer. Merci pour l'entrée cependant :)


Comme je l'ai dit dans des commentaires avant, il était proche de ce que je cherchais, mais pas exactement. C'est pourquoi je lui ai répondu moi-même et j'ai déclaré ce que je cherchais là-bas de sorte que quelqu'un d'autre regardant par-dessus la poste avait une idée de la façon dont j'ai résolu cela.



0
votes

D'accord, alors après avoir travaillé avec un ami sur le programme un peu, nous avons tous deux compris que nous devions appeler le programme dans une boucle et exécuter avant de l'avoir commis au dossier. Voici ce que nous avons écrit:

with open("Average2016.csv",'w') as f:
    writer = csv.writer(f)
    writer.writerow(['STATION','NAME','DATE','AWND','SNOW'])
    '''
    Fun for loop for generating dates. This uses zfill to pad the dates to 2 decimals
    and checks whether we are on Dec. or not. If we are, skip to next January.
    Then we use an f-string to create a SQL command and execute it and then write
    the return value into the CSV.
    '''
    for x in range(1, 13):
        date1 = '2016-' + str(x).zfill(2) + '-01'
        date2 = '2016-' + str(x + 1).zfill(2) + '-01'
        if (x == 12):
            date2 = '2017-01-01'
        sqlCmd = f"SELECT STATION, NAME, DATE, AWND, AVG(SNOW) FROM t WHERE (DATE >= '{date1}' AND DATE < '{date2}') GROUP BY STATION"
        db_val = cur.execute(sqlCmd)
        writer.writerows(db_val)


0 commentaires