2017-10-06 2 views
-2

mes données est formatée en tant que tel:Sélection de données CSV à l'aide de Workday Python

Username, Timestamp, Text 
Joe Bloggs, Thu Oct 5 09:00:00 +0000 2017, Starting work 
Jane Doe, Fri Oct 7 18:00:00 +0000 2017, Finished work 
Tom Smith, Sat Oct 8 04:00:00 +0000 2017, Still coding this thing 

J'ai un fichier CSV de lignes 5M comme celui-ci, et je voudrais extraire seulement ceux dans les 9 heures-17 heures du lundi au vendredi . J'ai lu beaucoup de publications sur les données factices et l'extraction ligne par ligne, mais j'aimerais vraiment filtrer l'ensemble de données dans son ensemble et les exemples sont incomplets ou confus pour les non-experts.

EDIT:

Merci à @ivan7707 pour la réponse. Voici mon code complété, je n'ai rien inclus au début car je savais que mon code était complètement faux. (J'avais des problèmes avec% z donc eu recours au fractionnement.)

import csv 
from datetime import datetime 
main_file = csv.DictReader(open("source.csv","rb")) 
for row in main_file: #points to csv 
    username = row['Username'] 
    text = row['Text'] 
    timestamp = row['Timestamp'] 

    #Convert timestamp to useable format 
    timestamp = timestamp.split() 
    timestamp = (timestamp[2] + "-" + timestamp[1] + "-" + timestamp[5] + " " + timestamp[3]) 
    dt = datetime.strptime(timestamp, "%d-%b-%Y %H:%M:%S") 

    if dt.isoweekday() in range(1, 6): #If day is Mon-Fri  
     if dt.hour in range(9, 17): #If hour is 9am-5pm 
      output_file.writerow([username,text,timestamp]) #Save 

EDIT 2:

Après la conversation ivan7707 et j'ai eu dans les commentaires, voici le code qui ajoute un numéro de la semaine aux données:

import csv 
from datetime import datetime 
main_file = csv.DictReader(open("source.csv","rb")) 
for row in main_file: 
    username = row['Username'] 
    text = row['Text'] 
    timestamp = row['Timestamp'] 

    #Convert timestamp to usable format as it was erroring with %z (+0000 part) 
    timestamp = timestamp.split() 
    timestamp = (timestamp[2] + "-" + timestamp[1] + "-" + timestamp[5] + " " + timestamp[3]) 
    dt = datetime.strptime(timestamp, "%d-%b-%Y %H:%M:%S") 

    #Check if timestamp is within Mon-Fri 9am-5pm 
    if dt.isoweekday() in range(1, 6): #Mon-Fri 
     if dt.hour in range(9, 17): #9am-5pm     
      weekday_list.append(week) 
      output_file.writerow([username,text,timestamp,week]) #Writes to csv 

    #Handy bit to iterate one week per 5 business days   
    elif dt.isoweekday() == 7: 
     if len(weekday_list) > 1: 
      weekday_list = [] 
      week += 1 

sortie pour le script hebdomadaire

Username, Timestamp, Text, Week, 
Joe Bloggs, 06-10-2017 16:59:59, Hello World!, 1 
Jane Doe, 09-10-2017 09:00:01, Hello!, 2 
+0

Ça sonne bien. Pourquoi ne pas essayer, alors revenez à utiliser avec un problème spécifique que vous rencontrez avec votre tentative, et nous serons heureux de vous aider. –

+0

Merci pour la réponse. J'ai résolu le problème grâce à ivan7707 ci-dessous, mais si vous savez comment enregistrer un csv après chaque semaine et chaque mois ce serait vraiment utile. –

Répondre

0

Python's datetime module est votre ami ici. Cela devrait être suffisant pour vous y mettre.

exemple:

from datetime import datetime 


dt = datetime.strptime("21/11/06 16:59", "%d/%m/%y %H:%M") 

if dt.isoweekday() in range(1, 6): 
    print('weekday') 

if dt.hour in range(9, 17:00): 
    print('working time') 

Soyez conscient du nombre exact dans la gamme ne sont pas inclus Good stack overflow answer

+0

Merci pour votre exemple, ces deux commandes (.isoweekday() et .hour) étaient tout ce dont j'avais besoin, mais pour la vie de moi, je ne pouvais pas les trouver. –

+0

Des indices sur la façon de l'adapter pour sauvegarder un csv après chaque semaine et chaque mois? –

+0

@ NickB, Salut Nick, je suis content que vous ayez réussi à comprendre. Si cela répond à votre question, veuillez la marquer comme telle. Ce que vous cherchez, c'est comment planifier les tâches. Sur Windows, j'utilise le planificateur de tâches pour exécuter des scripts que je dois exécuter selon un planning. Sous Linux, les tâches cron sont la solution. Si vous avez des problèmes avec cela, il devrait être configuré comme une question distincte. – ivan7707