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)

frazman
la source

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.

Simeon Visser
la source
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'
seddonym
la source
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
45

Utilisez date.weekday()ou date.isoweekday().

orlp
la source
7
Parce que l'op a demandé en ce qui concerne un datetimeobjet (pas un dateobjet), je voudrais mentionner que la datetimeclasse arbore la même chose weekday()et les isoweekday()méthodes.
Jens
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"))
Ashwini Chaudhary
la source
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')
Arnaldo P. Figueira Figueira
la source
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]
Rodrigo
la source
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
Vlad Bezden
la source
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.

Shashwat Siddhant
la source
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)
mathwizurd
la source
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)
Shiva_Achari
la source
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
Barry Andersen
la source
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)]
AnaCronIsm
la source
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
Yogesh
la source
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
nsky80
la source
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 ...

neoghost
la source
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
bœuf.
la source
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)
Brij Bhushan Nanda
la source
1

Utilisation du module Canlendar

import calendar
a=calendar.weekday(year,month,day)
days=["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]
print(days[a])
Ravi Bhushan
la source
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)
Lasith Niroshan
la source
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.")
Satyam Anand
la source
-1

utilisez ce code:

import pandas as pd
from datetime import datetime
print(pd.DatetimeIndex(df['give_date']).day)
Jeevan kumar
la source
-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
Thamaraikannan G
la source