1
votes

Fractionner la plage de dates avec l'heure par jour

J'ai une gamme de dates au fil du temps. Exemple:

from datetime import datetime,timedelta
diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]

start = datetime.strptime(diapason[0], "%Y-%m-%d %H:%M")
end = datetime.strptime(diapason[1], "%Y-%m-%d %H:%M")
r = [(start + timedelta(days=i)).strftime("%Y-%m-%d %H:%M:%S.%f") for i in range(0, (end-start).days, 1)]

print(r)

et je veux obtenir une telle scission:

diapason = [(2020-11-02 17:40, 2020-11-03 00:00), (2020-11-03 00:00, 2020-11-04 00:00), (2020-11-04 00:00, 2020-11-05 00:00), (2020-11-05 00:00, 2020-11-05 10:00)]

Comment puis-je faire ceci? Jusqu'à présent, je ne parviens à diviser que par 24 heures quelque chose comme ceci:

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]


2 commentaires

Je ne suis pas sûr de comprendre votre problème. Est-ce que vous voulez que vos intervalles soient de minuit un jour à minuit le lendemain? (Plus le premier et le dernier intervalle). Si tel est le cas, avez-vous envisagé de créer votre start et votre end à 00:00 heures, faites votre boucle for, puis remplacez le premier élément du premier et du dernier intervalle par votre diapason[0] et diapason[1] respectivement. Fondamentalement, vous créez les périodes de 24 heures de minuit à minuit, puis vous ajustez les première et dernière périodes.


oui, tu as bien compris mon problème, bonne idée, maintenant je vais l'essayer


3 Réponses :


0
votes

Générez d'abord toutes les dates possibles et ajoutez des horodatages de début et de fin. Triez-les et effectuez enfin une itération pour obtenir tous les couples possibles d'horodatages. Voici un exemple:

[(datetime.datetime(2020, 11, 2, 17, 40), datetime.datetime(2020, 11, 3, 0, 0)),
 (datetime.datetime(2020, 11, 3, 0, 0), datetime.datetime(2020, 11, 4, 0, 0)),
 (datetime.datetime(2020, 11, 4, 0, 0), datetime.datetime(2020, 11, 5, 0, 0)),
 (datetime.datetime(2020, 11, 5, 0, 0), datetime.datetime(2020, 11, 5, 10, 0))]

Ce qui vous donne:

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]
start = datetime.strptime(diapason[0], "%Y-%m-%d %H:%M")
end = datetime.strptime(diapason[-1], "%Y-%m-%d %H:%M")

dates = [datetime.strptime(str(date), "%Y-%m-%d %H:%M:%S") for date in pd.date_range(start.date() + timedelta(1), end.date())] + [start, end]
dates = sorted(dates)

diapason = []
for i in range(len(dates)-1):
    diapason.append((dates[i], dates[i+1]))

Vous pouvez ensuite les convertir en chaînes ou les reformater si vous préférez.


0 commentaires

0
votes

Vous pouvez utiliser:

['2020-11-02 17:40',
 '2020-11-03 00:00:00.000000',
 '2020-11-04 00:00:00.000000',
 '2020-11-05 00:00:00.000000',
 '2020-11-05 10:00']

qui te donne

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]

start = datetime.strptime(diapason[0], "%Y-%m-%d %H:%M")
end = datetime.strptime(diapason[1], "%Y-%m-%d %H:%M")

def d(date): return timedelta(hours=date.hour, minutes=date.minute, seconds=date.second)

r = [(start - d(start) + timedelta(days=i)).strftime("%Y-%m-%d %H:%M:%S.%f") for i in range(1, (end-start).days + 2)]
r = r + diapason
r.sort()
print(r)


0 commentaires

1
votes

Créez une plage de dates avec les éléments sous forme de listes, remplacez le premier et le dernier élément par une date de début / fin et mettez en forme des tuples de chaînes:

from datetime import datetime, timedelta

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]
start, end = [datetime.fromisoformat(d) for d in diapason]

output = [[start.date()+timedelta(d), start.date()+timedelta(d+1)] for d in range((end-start).days + 2)]
output[0][0], output[-1][-1] = start, end

output = [(l[0].strftime('%Y-%m-%d %H:%M'), l[1].strftime('%Y-%m-%d %H:%M')) for l in output]

# output
# [('2020-11-02 17:40', '2020-11-03 00:00'),
#  ('2020-11-03 00:00', '2020-11-04 00:00'),
#  ('2020-11-04 00:00', '2020-11-05 00:00'),
#  ('2020-11-05 00:00', '2020-11-05 10:00')]


0 commentaires