Come faccio ad avere una data per il giorno della settimana?


590

Voglio scoprire quanto segue: data una data ( datetimeoggetto), qual è il giorno corrispondente della settimana?

Ad esempio, domenica è il primo giorno, lunedì: secondo giorno ... e così via

E poi se l'input è qualcosa di simile alla data di oggi.

Esempio

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

L'output è forse 6(dato che è venerdì)

Risposte:


938

Usa weekday()( documenti ):

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

Dalla documentazione:

Restituisce il giorno della settimana come numero intero, dove lunedì è 0 e domenica è 6.


342
Una cosa importante da notare è che in JavaScript 0 = domenica, Python inizia con 0 = lunedì. Qualcosa in cui mi sono imbattuto, front-end vs back-end ..
Radtek,

4
La matematica del calendario in genere fa schifo perché i computer non sanno cos'è la PTO. Nel tentativo di evitare di insegnare loro, consiglio vivamente di offuscare le funzioni che determinano se è attualmente una vacanza o un fine settimana.
meawoppl

11
Probabilmente perché l'OP dice "Per esempio", "qualcosa di simile" e "forse".
Eugene,

10
Se vuoi che la domenica sia il giorno 0:int(datetime.datetime.today().strftime('%w'))
mrooney,

19
Per iniziare da 1, possiamo usare isoweekday al posto del giorno della settimana; 1 = lunedì
Aman Kumar

289

Se desideri avere la data in inglese:

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

1
Questa sembra essere la risposta migliore per generare una data inglese del giorno della settimana. Immagino che non sia stato votato più semplicemente perché la risposta ha ~ 1 mese, mentre la domanda ha ~ 3 anni.
Johnny Utahh,

20
Trovo molto più efficace fare semplicementemy_date.strftime('%A')
Nathan Tew il

questo mi ha salvato la giornata
Amol Bais,



29

Ho risolto questo problema per una domanda di 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

Una soluzione senza importazioni per date successive al 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')

perché dobbiamo spiegare aux + 100/400 anziché aux / 400, per favore, puoi spiegarlo
himanshu219

python3: basta cambiare tutto '/' con '//' nella funzione sopra e funzionerà come un incantesimo.
Chabir,

11

Questa è una soluzione se la data è un oggetto datetime.

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

10

Se hai delle date come stringa, potrebbe essere più semplice farlo usando il Timestamp di Panda

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

Produzione:

4 Friday

8

la libreria datetime a volte dà errori con strptime () quindi sono passato alla libreria di dateutil. Ecco un esempio di come puoi usarlo:

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

L'output che si ottiene da questo è 'Mon'. Se si desidera l'output come "lunedì", utilizzare quanto segue:

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

Questo ha funzionato per me abbastanza rapidamente. Ho riscontrato problemi durante l'utilizzo della libreria datetime perché volevo memorizzare il nome del giorno della settimana anziché il numero del giorno della settimana e il formato dell'utilizzo della libreria datetime causava problemi. Se non hai problemi con questo, fantastico! Se lo sei, lo farai sicuramente perché ha anche una sintassi più semplice. Spero che sia di aiuto.


6

Supponendo che ti venga dato il giorno, il mese e l'anno, potresti fare:

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)

Non è necessario utilizzare l'array DayL poiché è possibile ottenere direttamente il nome del giorno utilizzando strftime("%A")invece diweekday()
Lekr0

5

Supponi di avere timeStamp: variabile stringa, AAAA-MM-GG HH: MM: SS

passaggio 1 : convertilo in funzione dateTime con il codice di soffiaggio ...

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

Passo 2 : Ora puoi estrarre tutte le funzionalità richieste come di seguito che creeranno una nuova colonna per ciascuna delle ore, mese, giorno della settimana, anno, data

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

Se hai motivo di evitare l'uso del modulo datetime, questa funzione funzionerà.

Nota: si presume che il passaggio dal calendario giuliano al calendario gregoriano sia avvenuto nel 1582. Se questo non è vero per il tuo calendario di interesse, cambia la riga se l'anno> 1582: di conseguenza.

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' per sforzo! È possibile spostare istruzioni, come quelle assegnate a fge fj, all'interno del condizionale per evitare calcoli non necessari.
Tom Russell,

4

Se non fai solo affidamento sul datetimemodulo, calendarpotrebbe essere un'alternativa migliore. Questo, ad esempio, ti fornirà i codici giorno:

calendar.weekday(2017,12,22);

E questo ti darà il giorno stesso:

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

O nello stile di Python, come una fodera:

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

3

Possiamo prendere aiuto di Panda:

import pandas as pd

Come menzionato sopra nel problema, abbiamo:

datetime(2017, 10, 20)

Se esegui questa riga nel notebook jupyter abbiamo un output come questo:

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

Utilizzo del giorno della settimana () e del nome della settimana

Se vuoi giorni feriali in formato numero intero, usa:

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

L'output sarà:

4

E se lo vuoi come nome del giorno come domenica, lunedì, venerdì, ecc. Puoi usare:

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

L'output sarà:

'Friday'

Se hai una colonna di date nel frame di dati Pandas, allora:

Supponiamo ora che tu abbia un frame di dati Panda con una colonna di date come questa: 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]

Ora, se vogliamo conoscere il nome del giorno della settimana come lunedì, martedì, ecc., Possiamo usare .weekday_namecome segue:

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

l'output sarà:

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

E se vogliamo il numero intero del giorno della settimana da questa colonna Date, possiamo usare:

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

L'output sarà simile al seguente:

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()])

Campione di output

08 05 2015
Friday

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

questo dovrebbe darti il ​​tuo numero del giorno reale - 1 = domenica, 2 = lunedì, ecc ...


Perché dovresti usare +1? È pacifico che il numero di settimane in pitone inizia a sundat come 0 e lunedì come 1
Nebulosar,

2

Per ottenere la domenica da 1 a sabato come 7, questa è la soluzione più semplice alla tua domanda:

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

Tutti loro:

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')

Produzione:

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

La domanda richiede domenica == 1, lunedì == 2 e venerdì == 6.
bue.

2

ecco come convertire un elenco di date fino ad oggi

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

Utilizzo del modulo Canlendar

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

1

Ecco la mia implementazione di 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

Di seguito è riportato il codice per inserire la data nel formato GG-MM-AAAA, è possibile modificare il formato di input cambiando l'ordine di '% d-% m-% Y' e anche cambiando il delimitatore.

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

usa questo codice:

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

-1

importa numpy come np

data di definizione (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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.