¿Cómo obtengo el día de la semana una fecha en Python?

Quiero averiguar lo siguiente: dada una fecha (objeto datetime ), cuál es el día correspondiente de la semana.

Por ejemplo, el domingo es el primer día, el lunes: segundo día … y así sucesivamente

Y luego si la entrada es algo como la fecha de hoy.

Ejemplo

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

La salida es quizás 6 (desde su viernes).

Utilizar weekday() ( documentos ):

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

De la documentación:

Devuelva el día de la semana como un entero, donde el lunes es 0 y el domingo es 6.

Si quieres tener la fecha en inglés:

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

Use date.weekday() o date.isoweekday() .

Una solución sin importaciones para fechas posteriores 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') 

Resolví esto por una pregunta de 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") 

Si quieres tener la fecha en inglés:

 >>> from datetime import date >>> datetime.datetime.today().strftime('%A') 'Wednesday' 

Lea más: https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

Esta es una solución si la fecha es un objeto de fecha y hora.

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

La biblioteca datetime a veces da errores con strptime (), así que cambié a la biblioteca dateutil. Aquí hay un ejemplo de cómo puedes usarlo:

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

La salida que obtienes de esto es 'Mon' . Si desea que la salida sea “Lunes”, use lo siguiente:

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

Esto me funcionó bastante rápido. Estaba teniendo problemas al usar la biblioteca datetime porque quería almacenar el nombre del día de la semana en lugar del número del día de la semana y el formato del uso de la biblioteca datetime estaba causando problemas. Si no estás teniendo problemas con esto, ¡genial! Si es así, puede ir a por esto, ya que también tiene una syntax más simple. Espero que esto ayude.

Suponiendo que te den el día, el mes y el año, podrías hacer:

 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) 

Si tiene motivos para evitar el uso del módulo datetime, esta función funcionará.

Nota: Se supone que el cambio del calendario juliano al gregoriano ocurrió en 1582. Si esto no es cierto para su calendario de interés, cambie la línea si año> 1582: en consecuencia.

 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 

Si no depende únicamente del módulo datetime , el calendar podría ser una mejor alternativa. Esto, por ejemplo, le proporcionará los códigos de día:

 calendar.weekday(2017,12,22); 

Y esto te dará el día en sí:

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

O en el estilo de python, como un liner:

 ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"][calendar.weekday(2017,12,22)] 
 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()]) 

Muestra de salida

 08 05 2015 Friday 

Digamos que tienes timeStamp: Variable de cadena, YYYY-MM-DD HH: MM: SS

paso 1 : convertirlo a la función dateTime con código de golpe …

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

Paso 2 : Ahora puede extraer todas las características requeridas como se muestra a continuación, lo que creará una nueva columna para cada una de las horas de trabajo, mes, día de la semana, año, fecha

 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) 

Para obtener el domingo del 1 al sábado y del 7 al 7, esta es la solución más sencilla a su pregunta:

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

Todos ellos:

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

Salida:

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

Aquí es cómo convertir una lista de fechas hasta la fecha

 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) 

Podemos tomar la ayuda de Pandas:

 import pandas as pd 

Como se mencionó anteriormente en el problema tenemos:

 datetime(2017, 10, 20) 

Si ejecuta esta línea en el cuaderno jupyter tenemos una salida como esta:

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

Usando día de la semana () y nombre de semana:

Si desea días de la semana en formato de número entero, use:

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

La salida será:

 4 

Y si lo desea como nombre del día como domingo, lunes, viernes, etc. puede utilizar:

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

La salida será:

'Friday'

Si tiene una columna de fechas en el dataframe de Pandas, entonces:

Ahora suponga que si tiene un dataframe de pandas con una columna de fecha como esta: pdExampleDataFrame [‘Fechas’]. 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] 

Ahora, si queremos saber el nombre del día de la semana como lunes, martes, etc., podemos usar .weekday_name siguiente manera:

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

La salida será:

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

Y si queremos el número entero de día de la semana de esta columna de Fechas, entonces podemos usar:

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

La salida se verá así:

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

Usando el Módulo Canlendar

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

Aquí está mi implementación de 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) 

Si tiene fechas como una cadena, podría ser más fácil hacerlo usando la marca de tiempo de pandas

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

Salida:

 4 Friday