0
votes

Remplissez les dates manquantes avec 0 (zéro) en pandas

J'ai un grand fichier CSV avec des millions de lignes. Les données ressemblent à ceci. 2 colonnes (date, score) et millions de lignes. J'ai besoin des dates manquantes (par exemple le 1/1/16, le 14/1/1/1/1/1/1/16) pour avoir des valeurs "0" dans la colonne "Score" et conserver la "date" existante et "score" intact , tous dans le même CSV. Mais j'ai aussi plusieurs scores de plusieurs (centaines probablement) sur de nombreuses dates. Donc, avoir vraiment du mal à le coder. Vous avez levé de haut quelques exemples sur Stackoverflow, mais aucun d'entre eux ne semblait travailler encore. XXX PRE>

C'est ce que j'ai fait jusqu'à présent. Mais tout ce que je reçois, c'est une colonne d'index remplie de 3 ans de mes colonnes de «date» et de «score» remplies de '0'. J'apprécierai vraiment vos réponses et suggestions. Merci beaucoup. P>

import csv
import pandas as pd
import datetime as dt

df =pd.read_csv('myfile.csv')

dtr =pd.date_range('01.01.2016', '31.12.2018')
df.index  = pd.DatetimeIndex(df.index)
df =df.reindex(dtr,fill_value = 0)

df.to_csv('missingDateCorrected.csv', encoding ='utf-8', index =True)


5 commentaires

Le problème est qu'il y a quelques denttimes dupliqués tels que 15/1/16 . Dans la sortie, besoin sur une base sur un 15/1/16 ? Si oui, quelle shoudl sera la valeur avec 15/1/16 ? moyenne? premier?


Donc, pour les 10 premières lignes dans des données d'échantillons sont nécessaires, ajoutez 1/1/16 , 2/1/16 , 4/1/16 , 10/1/16 ?


Pardon. Je n'ai pas compris la question correctement. Mais pour clarifier à nouveau, pour la date à laquelle vous avez mentionné, j'en ai besoin d'avoir «0» dans le «score» tout en conservant mes autres données inchangées.


Comment a l'air dataframe définitive des 15 premières lignes de données d'échantillons?


C'est exactement comme je l'ai posté. Je viens de copier du fichier CSV et collé ici. Et je n'ai pas si je suis autorisé à poster un exemple de fichier. Merci.


3 Réponses :


0
votes

juste une idée. Essayez de vous échantillonner avec 1 jour et remplissez des zéros. comme: nd = df.Resample ('d'). Pad ()


0 commentaires

1
votes

Vous pouvez le faire comme ceci:

(Je l'ai fait avec un temps plus petit, alors changez la date de sorte qu'elle vous convient.) p>

df = pd.read_csv('myfile.csv', index_col=0)
df.index = pd.to_datetime(df.index, format='%d/%m/%y')

dtr =pd.date_range('01.01.2016', '01.10.2016', freq='D')
s = pd.Series(index=dtr)
df = pd.concat([df,s[~s.index.isin(df.index)]]).sort_index()
df = df.drop([0],axis=1).fillna(0)

df.to_csv('missingDateCorrected.csv', encoding ='utf-8', index =True)


2 commentaires

Dois-je modifier mes données de fichier CSV («date» et «score») au type dict pour le faire? Parce que les données ne sont pas au format du dictionnaire. Merci.


@Non_linear ofc non. Je n'ai créé que le Dataframe de cette façon de ne pas créer de fichier. Tant que vous avez un fichier de données la date comme votre index (format de date) et une colonne avec score, cela fonctionnera. Vous pouvez ensuite ignorer jusqu'à dTR = ...



1
votes

pas très efficace mais fonctionnera.

import pandas as pd

df = pd.read_csv('myfile.csv', index_col=0)
df.index = pd.to_datetime(df.index, format='%d/%m/%y')

dtr = pd.date_range('01.01.2016', '31.12.2018')

# Create an empty DataFrame from selected date range
empty = pd.DataFrame(index=dtr, columns=['score'])

# Append your CSV file
df = pd.concat([df, empty[~empty.index.isin(df.index)]]).sort_index().fillna(0)

df.to_csv('missingDateCorrected.csv', encoding='utf-8', index=True)


2 commentaires

Merci. Cela semble être très proche. Mais cela ajoute une date supplémentaire avec (NAN) pour chaque dates existantes.


Aucun problème - vient de mettre à jour ma réponse avec correction pour cela.