Comment puis-je obtenir le jour de la semaine une date?


591

Je veux savoir ce qui suit: étant donné une date ( datetimeobjet), quel est le jour de la semaine correspondant?

Par exemple, dimanche est le premier jour, lundi: deuxième jour .. et ainsi de suite

Et puis si l'entrée est quelque chose comme la date d'aujourd'hui.

Exemple

>>> today = datetime.datetime(2017, 10, 20)
>>> today.get_weekday()  # what I look for

La sortie est peut-être 6(puisque c'est vendredi)

Réponses:


940

Utilisation weekday()( docs ):

>>> import datetime
>>> datetime.datetime.today()
datetime.datetime(2012, 3, 23, 23, 24, 55, 173504)
>>> datetime.datetime.today().weekday()
4

De la documentation:

Renvoie le jour de la semaine sous forme d'entier, où lundi est 0 et dimanche est 6.


343
Une chose importante à noter est qu'en JavaScript 0 = dimanche, Python commence par 0 = lundi. Quelque chose que j'ai rencontré, front-end vs back-end ..
radtek

4
Les mathématiques du calendrier sont généralement nulles car les ordinateurs ne savent pas ce qu'est la prise de force. Afin d'éviter de leur enseigner, je recommande fortement les fonctions d'obscurcissement qui déterminent s'il s'agit actuellement d'un jour férié ou d'un week-end.
meawoppl

11
Probablement parce que l'OP dit "Par exemple", "quelque chose comme" et "peut-être".
Eugene

10
Si vous souhaitez que le dimanche soit le jour 0:int(datetime.datetime.today().strftime('%w'))
mrooney

19
Pour commencer à partir de 1, nous pouvons utiliser isoweekday au lieu du jour de la semaine; 1 = lundi
Aman Kumar

289

Si vous souhaitez avoir la date en anglais:

from datetime import date
import calendar
my_date = date.today()
calendar.day_name[my_date.weekday()]  #'Wednesday'

1
Cela semble être la meilleure réponse pour générer une date de jour de la semaine en anglais. Je suppose que ce n'est pas plus voté simplement parce que la réponse a environ 1 mois, alors que la question a environ 3 ans.
Johnny Utahh

20
Je trouve que c'est beaucoup plus efficace de le fairemy_date.strftime('%A')
Nathan Tew

cela m'a sauvé la journée
Amol Bais



29

J'ai résolu cela pour une question CodeChef .

import datetime
dt = '21/03/2012'
day, month, year = (int(x) for x in dt.split('/'))    
ans = datetime.date(year, month, day)
print (ans.strftime("%A"))

27

Une solution sans importation pour les dates postérieures à 1700/1/1

def weekDay(year, month, day):
    offset = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
    week   = ['Sunday', 
              'Monday', 
              'Tuesday', 
              'Wednesday', 
              'Thursday',  
              'Friday', 
              'Saturday']
    afterFeb = 1
    if month > 2: afterFeb = 0
    aux = year - 1700 - afterFeb
    # dayOfWeek for 1700/1/1 = 5, Friday
    dayOfWeek  = 5
    # partial sum of days betweem current date and 1700/1/1
    dayOfWeek += (aux + afterFeb) * 365                  
    # leap year correction    
    dayOfWeek += aux / 4 - aux / 100 + (aux + 100) / 400     
    # sum monthly and day offsets
    dayOfWeek += offset[month - 1] + (day - 1)               
    dayOfWeek %= 7
    return dayOfWeek, week[dayOfWeek]

print weekDay(2013, 6, 15) == (6, 'Saturday')
print weekDay(1969, 7, 20) == (0, 'Sunday')
print weekDay(1945, 4, 30) == (1, 'Monday')
print weekDay(1900, 1, 1)  == (1, 'Monday')
print weekDay(1789, 7, 14) == (2, 'Tuesday')

pourquoi devons-nous faire aux + 100/400 au lieu de aux / 400 pouvez-vous s'il vous plaît expliquer
himanshu219

python3: changez simplement tous les '/' avec '//' dans la fonction ci-dessus et cela fonctionnera comme un charme.
chabir

11

C'est une solution si la date est un objet datetime.

import datetime
def dow(date):
    days=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
    dayNumber=date.weekday()
    print days[dayNumber]

11

Si vous avez des dates sous forme de chaîne, il pourrait être plus facile de le faire en utilisant l'horodatage des pandas

import pandas as pd
df = pd.Timestamp("2019-04-12")
print(df.dayofweek, df.weekday_name)

Production:

4 Friday

8

La bibliothèque datetime donne parfois des erreurs avec strptime () donc je suis passé à la bibliothèque dateutil. Voici un exemple de la façon dont vous pouvez l'utiliser:

from dateutil import parser
parser.parse('January 11, 2010').strftime("%a")

La sortie que vous obtenez de cela est 'Mon'. Si vous souhaitez que la sortie soit «lundi», utilisez ce qui suit:

parser.parse('January 11, 2010').strftime("%A")

Cela a fonctionné assez rapidement pour moi. J'avais des problèmes lors de l'utilisation de la bibliothèque datetime car je voulais stocker le nom du jour de la semaine au lieu du numéro du jour de la semaine et le format de l'utilisation de la bibliothèque datetime posait des problèmes. Si cela ne vous pose aucun problème, tant mieux! Si vous l'êtes, vous pouvez définitivement y aller car il a également une syntaxe plus simple. J'espère que cela t'aides.


6

En supposant que l'on vous donne le jour, le mois et l'année, vous pouvez faire:

import datetime
DayL = ['Mon','Tues','Wednes','Thurs','Fri','Satur','Sun']
date = DayL[datetime.date(year,month,day).weekday()] + 'day'
#Set day, month, year to your value
#Now, date is set as an actual day, not a number from 0 to 6.

print(date)

Il n'est pas nécessaire d'utiliser le tableau DayL car vous pouvez obtenir directement le nom du jour en utilisant strftime("%A")au lieu deweekday()
Lekr0

5

Supposons que vous ayez timeStamp: variable de chaîne, YYYY-MM-DD HH: MM: SS

étape 1 : le convertir en fonction dateTime avec le code de coup ...

df['timeStamp'] = pd.to_datetime(df['timeStamp'])

Étape 2 : Maintenant, vous pouvez extraire toutes les fonctionnalités requises comme ci-dessous, ce qui créera une nouvelle colonne pour chacune des heures, mois, jour de la semaine, année, date

df['Hour'] = df['timeStamp'].apply(lambda time: time.hour)
df['Month'] = df['timeStamp'].apply(lambda time: time.month)
df['Day of Week'] = df['timeStamp'].apply(lambda time: time.dayofweek)
df['Year'] = df['timeStamp'].apply(lambda t: t.year)
df['Date'] = df['timeStamp'].apply(lambda t: t.day)

4

Si vous avez des raisons d'éviter l'utilisation du module datetime, cette fonction fonctionnera.

Remarque: Le changement du calendrier julien au calendrier grégorien est supposé avoir eu lieu en 1582. Si ce n'est pas le cas pour votre calendrier d'intérêt, changez la ligne si année> 1582: en conséquence.

def dow(year,month,day):
    """ day of week, Sunday = 1, Saturday = 7
     http://en.wikipedia.org/wiki/Zeller%27s_congruence """
    m, q = month, day
    if m == 1:
        m = 13
        year -= 1
    elif m == 2:
        m = 14
        year -= 1
    K = year % 100    
    J = year // 100
    f = (q + int(13*(m + 1)/5.0) + K + int(K/4.0))
    fg = f + int(J/4.0) - 2 * J
    fj = f + 5 - J
    if year > 1582:
        h = fg % 7
    else:
        h = fj % 7
    if h == 0:
        h = 7
    return h

1
«A» pour l'effort! Vous pouvez déplacer des instructions, comme celles affectées à fget fj, à l'intérieur du conditionnel pour éviter des calculs inutiles.
Tom Russell

4

Si vous ne dépendez pas uniquement du datetimemodule, cela calendarpourrait être une meilleure alternative. Ceci, par exemple, vous fournira les codes de jour:

calendar.weekday(2017,12,22);

Et cela vous donnera le jour lui-même:

days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
days[calendar.weekday(2017,12,22)]

Ou dans le style du python, comme une doublure:

["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"][calendar.weekday(2017,12,22)]

3

Nous pouvons prendre l'aide de Pandas:

import pandas as pd

Comme mentionné ci-dessus dans le problème, nous avons:

datetime(2017, 10, 20)

Si vous exécutez cette ligne dans le cahier jupyter, nous avons une sortie comme celle-ci:

datetime.datetime(2017, 10, 20, 0, 0)

En utilisant le jour de la semaine () et le nom de la semaine:

Si vous voulez des jours de la semaine au format numérique, utilisez:

pd.to_datetime(datetime(2017, 10, 20)).weekday()

La sortie sera:

4

Et si vous le voulez comme nom du jour comme dimanche, lundi, vendredi, etc., vous pouvez utiliser:

pd.to_datetime(datetime(2017, 10, 20)).weekday_name

La sortie sera:

'Friday'

Si vous avez une colonne de dates dans la trame de données Pandas, alors:

Supposons maintenant que si vous avez un cadre de données pandas ayant une colonne de date comme celle-ci: pdExampleDataFrame ['Dates']. Head (5)

0   2010-04-01
1   2010-04-02
2   2010-04-03
3   2010-04-04
4   2010-04-05
Name: Dates, dtype: datetime64[ns]

Maintenant, si nous voulons connaître le nom du jour de la semaine comme lundi, mardi, ..etc, nous pouvons utiliser .weekday_namecomme suit:

pdExampleDataFrame.head(5)['Dates'].dt.weekday_name

la sortie sera:

0    Thursday
1      Friday
2    Saturday
3      Sunday
4      Monday
Name: Dates, dtype: object

Et si nous voulons le nombre entier de jours de semaine de cette colonne Dates, nous pouvons utiliser:

pdExampleDataFrame.head(5)['Dates'].apply(lambda x: x.weekday())

La sortie ressemblera à ceci:

0    3
1    4
2    5
3    6
4    0
Name: Dates, dtype: int64

3
import datetime
import calendar

day, month, year = map(int, input().split())
my_date = datetime.date(year, month, day)
print(calendar.day_name[my_date.weekday()])

Échantillon de sortie

08 05 2015
Friday

3
import datetime
int(datetime.datetime.today().strftime('%w'))+1

cela devrait vous donner votre numéro de jour réel - 1 = dimanche, 2 = lundi, etc ...


Pourquoi voudriez-vous utiliser +1? Il est courant que la numérotation des semaines en python commence à sundat à 0 et lundi à 1.
Nebulosar

2

Pour obtenir du dimanche 1 au samedi 7, voici la solution la plus simple à votre question:

datetime.date.today().toordinal()%7 + 1

Tous:

import datetime

today = datetime.date.today()
sunday = today - datetime.timedelta(today.weekday()+1)

for i in range(7):
    tmp_date = sunday + datetime.timedelta(i)
    print tmp_date.toordinal()%7 + 1, '==', tmp_date.strftime('%A')

Production:

1 == Sunday
2 == Monday
3 == Tuesday
4 == Wednesday
5 == Thursday
6 == Friday
7 == Saturday

La question demande dimanche == 1, lundi == 2 et vendredi == 6.
bœuf.

2

voici comment convertir une liste de dates en date

import datetime,time
ls={'1/1/2007','1/2/2017'}
dt=datetime.datetime.strptime(ls[1], "%m/%d/%Y")
print(dt)
print(dt.month)
print(dt.year)

1

Utilisation du module Canlendar

import calendar
a=calendar.weekday(year,month,day)
days=["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]
print(days[a])

1

Voici mon implémentation python3.

months = {'jan' : 1, 'feb' : 4, 'mar' : 4, 'apr':0, 'may':2, 'jun':5, 'jul':6, 'aug':3, 'sep':6, 'oct':1, 'nov':4, 'dec':6}
dates = {'Sunday':1, 'Monday':2, 'Tuesday':3, 'Wednesday':4, 'Thursday':5, 'Friday':6, 'Saterday':0}
ranges = {'1800-1899':2, '1900-1999':0, '2000-2099':6, '2100-2199':4, '2200-2299':2}

def getValue(val, dic):
    if(len(val)==4):
        for k,v in dic.items():
            x,y=int(k.split('-')[0]),int(k.split('-')[1])
            val = int(val)
            if(val>=x and val<=y):
                return v
    else:
        return dic[val]

def getDate(val):
    return (list(dates.keys())[list(dates.values()).index(val)]) 



def main(myDate):
    dateArray = myDate.split('-')
    # print(dateArray)
    date,month,year = dateArray[2],dateArray[1],dateArray[0]
    # print(date,month,year)

    date = int(date)
    month_v = getValue(month, months)
    year_2 = int(year[2:])
    div = year_2//4
    year_v = getValue(year, ranges)
    sumAll = date+month_v+year_2+div+year_v
    val = (sumAll)%7
    str_date = getDate(val)

    print('{} is a {}.'.format(myDate, str_date))

if __name__ == "__main__":
    testDate = '2018-mar-4'
    main(testDate)

1

Ci-dessous est le code pour entrer la date au format JJ-MM-AAAA, vous pouvez changer le format d'entrée en changeant l'ordre de '% d-% m-% Y' et aussi en changeant le délimiteur.

import datetime
try:
    date = input()
    date_time_obj = datetime.datetime.strptime(date, '%d-%m-%Y')
    print(date_time_obj.strftime('%A'))
except ValueError:
    print("Invalid date.")

-1

utilisez ce code:

import pandas as pd
from datetime import datetime
print(pd.DatetimeIndex(df['give_date']).day)

-1

import numpy as np

date de déf. (df):

df['weekday'] = df['date'].dt.day_name()

conditions = [(df['weekday'] == 'Sunday'),
          (df['weekday'] == 'Monday'),
          (df['weekday'] == 'Tuesday'),
          (df['weekday'] == 'Wednesday'),
          (df['weekday'] == 'Thursday'),
          (df['weekday'] == 'Friday'),
          (df['weekday'] == 'Saturday')]

choices = [0, 1, 2, 3, 4, 5, 6]

df['week'] = np.select(conditions, choices)

return df
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.