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

frazman
fuente

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.

Simeon Visser
fuente
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'
seddonym
fuente
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"))
Ashwini Chaudhary
fuente
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')
Arnaldo P. Figueira Figueira
fuente
¿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]
Rodrigo
fuente
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
Vlad Bezden
fuente
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.

Shashwat Siddhant
fuente
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)
Mathwizurd
fuente
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)
Shiva_Achari
fuente
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
Barry Andersen
fuente
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)]
AnaCronIsm
fuente
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
Yogesh
fuente
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
nsky80
fuente
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.

neoghost
fuente
¿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
buey.
fuente
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)
Brij Bhushan Nanda
fuente
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])
Ravi Bhushan
fuente
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)
Lasith Niroshan
fuente
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.")
Satyam Anand
fuente
-1

usa este código:

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