4
votes

Comment puis-je charger tous les jours de la semaine, entre une date de début et une date de fin, dans un bloc de données?

J'ai créé une routine simple qui ajoute toutes les dates, entre une date de début et une date de fin, à un dataframe.

import datetime

begin = datetime.date(2018, 1, 1)
end = datetime.date(2019, 1, 10)

weekdays = []

next_day = begin
while True:
    if next_day > end:
        break
    print(next_day)
    next_day += datetime.timedelta(days=1)
    weekdays.append(str(next_day))
dfwk = pd.DataFrame(weekdays)

J'essaie de comprendre comment n'ajouter que les jours de la semaine à la datframe. En outre, j'essaie de comprendre comment ajouter les noms des jours de la semaine. Comment puis-je faire ceci? En gros, je veux une dateframe qui ressemble à ceci.

entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

pour obtenir les jours ouvrables par date_range:

import pandas as pd

datetime_index = pd.date_range('2018-07-20', '2018-08-19', freq=pd.tseries.offsets.BDay()).tolist()
weekday_name = [d.strftime('%A') for d in datetime_index]

df = pd.DataFrame(list(zip(datetime_index, weekday_name)), columns=['date', 'day name'])
print(df)


1 commentaires

Merci beaucoup, Menglong Li. Ceci est exactement ce que je cherchais. Je viens d'apprendre à utiliser la fonction zip le week-end dernier. Je l'aime beaucoup. J'utiliserai beaucoup plus cela à l'avenir.



1
votes

Vous pouvez essayer d'ajouter vos dates à une liste de (date, nom de la semaine) , puis de les convertir en dataframe à la fin:

           date weekdayname
0    2018-01-02     Tuesday
1    2018-01-03   Wednesday
2    2018-01-04    Thursday
3    2018-01-05      Friday
4    2018-01-06    Saturday
5    2018-01-07      Sunday
6    2018-01-08      Monday
7    2018-01-09     Tuesday
8    2018-01-10   Wednesday
9    2018-01-11    Thursday
10   2018-01-12      Friday
11   2018-01-13    Saturday
12   2018-01-14      Sunday
13   2018-01-15      Monday
14   2018-01-16     Tuesday
15   2018-01-17   Wednesday
...

Ce qui donne quelque chose comme :

from pandas import DataFrame

from datetime import date
from datetime import timedelta

from calendar import day_name

begin = date(2018, 1, 1)
end = date(2019, 1, 10)

# Get difference between dates
delta = end - begin

dates = []

# Only iterate through dates between
for i in range(1, delta.days):

    # Get next date with timedelta()
    next_date = begin + timedelta(i)

    # Append next date and weekday name
    dates.append((next_date, day_name[next_date.weekday()]))

# Convert to dataframe
df = DataFrame(dates, columns=['date', 'weekdayname'])
print(df)

Remarque: Ce qui précède suppose que les dates de début et de fin sont exclusives. Si vous voulez qu'ils soient inclusifs, utilisez plutôt range (delta.days + 1) .


0 commentaires

2
votes

Voici un moyen de résoudre votre question en utilisant date et timedelta à partir du module datetime :

           date   day name
0    2018-01-02    Tuesday
1    2018-01-03  Wednesday
2    2018-01-04   Thursday
3    2018-01-05     Friday
4    2018-01-06   Saturday
5    2018-01-07     Sunday
6    2018-01-08     Monday
7    2018-01-09    Tuesday
8    2018-01-10  Wednesday
9    2018-01-11   Thursday
10   2018-01-12     Friday
...
368  2019-01-05   Saturday
369  2019-01-06     Sunday
370  2019-01-07     Monday
371  2019-01-08    Tuesday
372  2019-01-09  Wednesday
373  2019-01-10   Thursday

Sortie:

import pandas as pd
from datetime import date, timedelta

def next_day(begin, end):
    """Generator that returns the date and date's weekday name"""

    while begin < end:
        # If you need the first day
        # uncomment the next line and comment the next yield one
        # yield begin, begin.strftime('%A')
        begin += timedelta(days=1)
        yield begin, begin.strftime('%A')


begin = date(2018, 1, 1)
end = date(2019, 1, 10)
df = pd.DataFrame(next_day(begin, end), columns=['date', 'day name'])
print(df)


0 commentaires