Quiero averiguar lo siguiente: dada una fecha (objeto de fecha y datetime ), ¿cuál es el día de la semana correspondiente?
Por ejemplo, el domingo es el primer día, el lunes: el segundo día... y así sucesivamente.
Y luego, si la entrada es algo así como la fecha de hoy.
>>> today = datetime.datetime(2017, 10, 20) >>> today.get_weekday() # what I look for La salida es tal vez 6 (ya que es viernes)
Usa date.weekday() cuando el lunes es 0 y el domingo es 6
o
date.isoweekday() cuando el lunes es 1 y el domingo es 7
Usar el día de la weekday() :
>>> import datetime >>> datetime.datetime.today() datetime.datetime(2012, 3, 23, 23, 24, 55, 173504) >>> datetime.datetime.today().weekday() 4De la documentación :
Devuelve el día de la semana como un número entero, donde el lunes es 0 y el domingo es 6.
Suponiendo que le den el día, el mes y el año, podría hacer lo siguiente:
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)Para obtener el domingo como 1 hasta el sábado como 7, esta es la solución más simple a su pregunta:
datetime.date.today().toordinal()%7 + 1Todos 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')Producción:
1 == Sunday 2 == Monday 3 == Tuesday 4 == Wednesday 5 == Thursday 6 == Friday 7 == SaturdayUna solución sin importaciones para fechas posteriores a 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')Si desea tener la fecha en inglés:
from datetime import date import calendar my_date = date.today() calendar.day_name[my_date.weekday()] #'Wednesday'Si tiene motivos para evitar el uso del módulo de fecha y hora, entonces 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 el año es > 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 hEsta 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í tienes un ejemplo de cómo puedes usarlo:
from dateutil import parser parser.parse('January 11, 2010').strftime("%a") El resultado que obtienes de esto es 'Mon' . Si desea que la salida sea 'lunes', use lo siguiente:
parser.parse('January 11, 2010').strftime("%A")Esto funcionó para mí bastante rápido. Estaba teniendo problemas al usar la biblioteca de fecha y hora 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 al usar la biblioteca de fecha y hora estaba causando problemas. Si no tienes problemas con esto, ¡genial! Si es así, definitivamente puede optar por esto, ya que también tiene una sintaxis más simple. Espero que esto ayude.
A continuación se explica cómo convertir una lista de fechas de cadenas little endian a datetime :
import datetime, time ls = ['31/1/2007', '14/2/2017'] for d in ls: dt = datetime.datetime.strptime(d, "%d/%m/%Y") print(dt) print(dt.strftime("%A"))Si no depende únicamente del módulo de datetime , el calendar podría ser una mejor alternativa. Esto, por ejemplo, te proporcionará los códigos de día:
calendar.weekday(2017,12,22);Y esto te dará el día mismo:
days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"] days[calendar.weekday(2017,12,22)]O al estilo de python, como una sola línea:
["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"][calendar.weekday(2017,12,22)]Uso del 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 desea tener la fecha en inglés:
>>> from datetime import datetime >>> datetime.today().strftime('%A') 'Wednesday'Lea más: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
Podemos tomar la ayuda de Pandas:
import pandas as pdComo se mencionó anteriormente en el problema Tenemos:
datetime(2017, 10, 20)Si ejecutamos esta línea en el cuaderno jupyter tenemos una salida como esta:
datetime.datetime(2017, 10, 20, 0, 0)Usando el día de la semana () y el nombre del día de la semana:
Si desea días de la semana en formato de número entero, utilice:
pd.to_datetime(datetime(2017, 10, 20)).weekday()La salida será:
4Y si lo quieres como nombre del día como domingo, lunes, viernes, etc puedes usar:
pd.to_datetime(datetime(2017, 10, 20)).weekday_nameLa salida será:
'Friday'
Si tiene una columna de fechas en el marco de datos de Pandas, entonces:
Ahora suponga que tiene un marco de datos de pandas con una columna de fecha como esta: 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] Ahora, si queremos saber el nombre del día de la semana como lunes, martes, etc., podemos usar .weekday_name de la siguiente manera:
pdExampleDataFrame.head(5)['Dates'].dt.weekday_namela salida será:
0 Thursday 1 Friday 2 Saturday 3 Sunday 4 Monday Name: Dates, dtype: objectY si queremos el número entero del día de la semana de esta columna de fechas, 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: int64import datetime import calendar day, month, year = map(int, input().split()) my_date = datetime.date(year, month, day) print(calendar.day_name[my_date.weekday()]) 08 05 2015 FridayDigamos que tiene timeStamp: variable de cadena, AAAA-MM-DD HH: MM: SS
paso 1 : conviértalo a la función dateTime con código de soplado ...
df['timeStamp'] = pd.to_datetime(df['timeStamp'])Paso 2 : ahora puede extraer todas las funciones requeridas como se muestra a continuación, lo que creará una nueva columna para cada uno de los campos: hora, 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)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)Producción:
4 Fridayimport datetime int(datetime.datetime.today().strftime('%w'))+1esto debería darte tu número de día real - 1 = domingo, 2 = lunes, etc...
usa este código:
import pandas as pd from datetime import datetime print(pd.DatetimeIndex(df['give_date']).day)import numpy as np def date(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 dfA continuación se muestra el código para ingresar la fecha en el formato DD-MM-YYYY. Puede cambiar el formato de entrada cambiando el orden de '%d-%m-%Y' y también cambiando el delimitador.
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.")Si desea generar una columna con un rango de fechas ( Date ) y generar una columna que vaya a la primera y asigne el Día de la semana ( Día de la Week Day ), haga lo siguiente (Usaré las fechas que van desde 2008-01-01 al 2020-02-01 ):
import pandas as pd dr = pd.date_range(start='2008-01-01', end='2020-02-1') df = pd.DataFrame() df['Date'] = dr df['Week Day'] = pd.to_datetime(dr).weekdayLa salida es la siguiente:
El Week Day varía de 0 a 6, donde 0 corresponde al lunes y 6 al domingo.
Aquí hay un fragmento de código simple para resolver este problema
import datetime intDay = datetime.date(year=2000, month=12, day=1).weekday() days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] print(days[intDay])La salida debe ser:
FridayUna opción simple, directa y aún no mencionada:
import datetime ... givenDateObj = datetime.date(2017, 10, 20) weekday = givenDateObj.isocalendar()[2] # 5 weeknumber = givenDateObj.isocalendar()[1] # 42Esto no necesita comentarios sobre el día de la semana.
¡Recomiendo este código~!
import datetime DAY_OF_WEEK = { "MONDAY": 0, "TUESDAY": 1, "WEDNESDAY": 2, "THURSDAY": 3, "FRIDAY": 4, "SATURDAY": 5, "SUNDAY": 6 } def string_to_date(dt, format='%Y%m%d'): return datetime.datetime.strptime(dt, format) def date_to_string(date, format='%Y%m%d'): return datetime.datetime.strftime(date, format) def day_of_week(dt): return string_to_date(dt).weekday() dt = '20210101' if day_of_week(dt) == DAY_OF_WEEK['SUNDAY']: None