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


590

Quiero averiguar lo siguiente: dada una fecha ( datetimeobjeto), ¿cuál es el día de la semana correspondiente?

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

Y luego, si la entrada es algo así 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(ya que es viernes)

Respuestas:


938

Uso weekday()( docs ):

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

De la documentación:

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


342
Una cosa importante a tener en cuenta es que en JavaScript 0 = domingo, Python comienza con 0 = lunes. Algo con lo que me encontré, front-end vs back-end ..
radtek

44
Las matemáticas de calendario generalmente apestan porque las computadoras no saben qué es el PTO. En un esfuerzo por evitar enseñarles, recomiendo encarecidamente las funciones de ofuscación que determinan si actualmente es feriado o fin de semana.
meawoppl

11
Probablemente porque el OP dice "Por ejemplo", "algo así como" y "tal vez".
Eugene

10
Si desea que el domingo sea el día 0:int(datetime.datetime.today().strftime('%w'))
mrooney

19
Para comenzar desde 1, podemos usar isoweekday en lugar del día de la semana; 1 = lunes
Aman Kumar

289

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'

1
Esta parece ser la mejor respuesta para generar una fecha en inglés del día de la semana. Supongo que no se votó más simplemente porque la respuesta tiene ~ 1 mes, mientras que la pregunta tiene ~ 3 años.
Johnny Utahh

20
Me parece mucho más efectivo simplemente hacermy_date.strftime('%A')
Nathan Tew el

esto me salvó el día
Amol Bais



29

Resolví esto para 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"))

27

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

¿por qué tenemos que hacer aux + 100/400 en lugar de aux / 400 se puede explicar por favor
himanshu219

python3: simplemente cambie todo '/' con '//' en la función anterior y funcionará de maravilla.
chabir

11

Esta es una solución si la fecha es un objeto datetime.

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

10

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

8

La biblioteca de fecha y hora 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")

El resultado que obtienes de esto es 'Mon'. Si desea la salida como '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 de día de la semana y el formato de usar la biblioteca de fecha y hora estaba causando problemas. Si no tienes problemas con esto, ¡genial! Si es así, puede hacerlo definitivamente, ya que también tiene una sintaxis más simple. Espero que esto ayude.


6

Suponiendo que le den el día, mes y año, podría 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)

No es necesario usar la matriz DayL, ya que puede obtener directamente el nombre del día usando en strftime("%A")lugar deweekday()
Lekr0

5

Digamos 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 soplo ...

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

4

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

1
'A' por esfuerzo! Puede mover declaraciones, como las que se asignan a , fgy fjdentro del condicional para evitar cálculos innecesarios.
Tom Russell

4

Si no solo depende de datetime módulo, calendarpodrí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 trazador de líneas:

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

3

Podemos tomar la ayuda de los 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 día de la semana:

Si desea entre semana en formato de número entero, use:

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

El resultado será:

4

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

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

El resultado será:

'Friday'

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

Ahora suponga que si tiene un marco de datos de pandas que tiene 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_namelo siguiente:

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

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

Muestra de salida

08 05 2015
Friday

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

esto debería darte tu número de día real: 1 = domingo, 2 = lunes, etc.


¿Por qué usarías +1? Es habitual que la numeración semanal en Python comience en sundat como 0 y lunes como 1.
Nebulosar

2

Para obtener el domingo del 1 al sábado como el 7, esta es la solución más simple 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

La pregunta pide domingo == 1, lunes == 2 y viernes == 6.
buey.

2

aquí es cómo convertir una lista de fechas a 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)

1

Usando el Módulo Canlendar

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

1

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)

1

A continuación se muestra el código para ingresar la fecha en el formato DD-MM-AAAA. 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.")

-1

usa este código:

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

-1

importar numpy como np

fecha def (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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.