J'ai une table d'accès avec un champ "Date". Il a des dates aléatoires pour chaque enregistrement. J'ai construit un script pour ajouter tous les enregistrements dans une liste, puis définir la liste pour filtrer uniquement les valeurs uniques: Ce retour (sur ma table de test): P > ['07-06-2010', '07 -05-2010 ', '06 -25-2010'] p> maintenant que j'ai l'unique Valeurs pour le champ "date_observation", je souhaite détecter si: p> Toute suggestion serait très appréciée!
Mike P> P>
4 Réponses :
Plutôt que de rouler votre propre Fonction code> consécutive Vous pouvez simplement convertir des objets de date en entiers à l'aide de la méthode .POORDININAL () CODE> Méthode d'objets DateTime. La différence entre la valeur maximale et minimale de l'ensemble des dates ordinales est une longueur de plus que la longueur de l'ensemble:
Merci Michael. Cela a bien fonctionné avec mon script! J'apprécie votre réponse.
@Michael Dillon: Sélectionnez Distinct .. code> Comme dans le commentaire de @ Deathapril est encore meilleur.
Si nous considérons ['01 -01-2000 ', '01 -01-2000', '01 -02-2000 '] Pour ne pas être consécutifs, l'utilisation de ce code indiquera que les dates sont consécutives, comment pourriez-vous modifier votre code à considérer cette exigence? Je ne sais pas à quel point les ensembles fonctionnent encore.
@ MOASTHANL0L: Définit les doublons. Si vous souhaitez envisager une liste avec des doublons comme non consécutive, vous pouvez vérifier si la longueur de votre liste de dates est supérieure à la longueur de l'ensemble des dates.
Utilisez votre base de données pour sélectionner des dates uniques dans la commande ascendante:
Si la requête renvoie une seule date, c'est votre premier cas p> li>
sinon découvrez si les dates sont consécutives: p>
dates = <query database>
if all(consecutive(dates[i], dates[i+1]) for i in xrange(len(dates) - 1)):
if len(dates) == 1: # unique
# 1st case: all records have the same date
else:
# the dates are a range of dates
else:
# non-consecutive dates
Voici ma version à l'aide de la fonction Réduire ().
from datetime import date, timedelta
def checked(d1, d2):
"""
We assume the date list is sorted.
If d2 & d1 are different by 1, everything up to d2 is consecutive, so d2
can advance to the next reduction.
If d2 & d1 are not different by 1, returning d1 - 1 for the next reduction
will guarantee the result produced by reduce() to be something other than
the last date in the sorted date list.
Definition 1: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider consecutive
Definition 2: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider not consecutive
"""
#if (d2 - d1).days == 1 or (d2 - d1).days == 0: # for Definition 1
if (d2 - d1).days == 1: # for Definition 2
return d2
else:
return d1 + timedelta(days=-1)
# datelist = [date(2014, 1, 1), date(2014, 1, 3),
# date(2013, 12, 31), date(2013, 12, 30)]
# datelist = [date(2014, 2, 19), date(2014, 2, 19), date(2014, 2, 20),
# date(2014, 2, 21), date(2014, 2, 22)]
datelist = [date(2014, 2, 19), date(2014, 2, 21),
date(2014, 2, 22), date(2014, 2, 20)]
datelist.sort()
if datelist[-1] == reduce(checked, datelist):
print "dates are consecutive"
else:
print "dates are not consecutive"
Une autre version en utilisant la même logique que dans mon autre réponse.
from datetime import date, timedelta
# Definition 1: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider consecutive
# Definition 2: 1/1/14, 1/2/14, 1/2/14, 1/3/14 is consider not consecutive
# datelist = [date(2014, 1, 1), date(2014, 1, 3),
# date(2013, 12, 31), date(2013, 12, 30)]
# datelist = [date(2014, 2, 19), date(2014, 2, 19), date(2014, 2, 20),
# date(2014, 2, 21), date(2014, 2, 22)]
datelist = [date(2014, 2, 19), date(2014, 2, 21),
date(2014, 2, 22), date(2014, 2, 20)]
datelist.sort()
previousdate = datelist[0]
for i in range(1, len(datelist)):
#if (datelist[i] - previousdate).days == 1 or (datelist[i] - previousdate).days == 0: # for Definition 1
if (datelist[i] - previousdate).days == 1: # for Definition 2
previousdate = datelist[i]
else:
previousdate = previousdate + timedelta(days=-1)
if datelist[-1] == previousdate:
print "dates are consecutive"
else:
print "dates are not consecutive"
Courte Répondre paresseuse: Convertissez-les en objets DateTime, triez-les puis utilisez la recette code> par paires code> à partir de la page code> iTertools code> DOC pour comparer toutes les dates sur la liste suivante dans la liste pour voir si C'est une gamme; Pour les dates simples, prenez la date du premier et vérifiez que tous les autres sont dans le même jour de calendrier; Si ces deux échaissent sont des dates disparates.
Si vous ne sélectionnez pas d'autres valeurs, utilisez
Sélectionnez Date_observation à partir d'une commande MyTable par date_observation Desc code> et ne convertissez pas les dates en cordes ..@Deathpril: Pourquoi la commande descendante?
@ J.f.sebastian euh , aucune raison - j'ai vu '07 -06-2010 ', '06 -24-2010' dans la question et ignoré le reste des exemples, je suppose ..