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.
3 Réponses :
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)
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.
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) .
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)