Como recebo uma data no dia da semana?


589

Quero descobrir o seguinte: dada uma data ( datetimeobjeto), qual é o dia da semana correspondente?

Por exemplo, domingo é o primeiro dia, segunda-feira: segundo dia ... e assim por diante

E então, se a entrada é algo como a data de hoje.

Exemplo

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

A saída é talvez 6(desde sexta-feira)

Respostas:


937

Uso weekday()( documentos ):

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

A partir da documentação:

Retorne o dia da semana como um número inteiro, onde segunda-feira é 0 e domingo é 6.


342
Uma coisa importante a ser observada é que no JavaScript 0 = domingo, o Python começa com 0 = segunda-feira. Algo que eu corri em, front-end vs back-end ..
radtek

4
A matemática do calendário geralmente é uma porcaria porque os computadores não sabem o que é a TDF. Em um esforço para evitar ensiná-los, recomendo funções ofuscantes que determinam se atualmente é feriado ou fim de semana.
meawoppl

11
Provavelmente porque o OP diz "Por exemplo", "algo como" e "talvez".
Eugene

10
Se você gostaria que o domingo fosse o dia 0:int(datetime.datetime.today().strftime('%w'))
mrooney 13/12

19
Para começar a partir de 1, podemos usar isoweekday no lugar do weekday; 1 = segunda
Aman Kumar

289

Se você deseja ter a data em inglês:

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

1
Essa parece ser a melhor resposta para gerar uma data do dia da semana em inglês. Eu acho que não foi votado mais simplesmente porque a resposta tem ~ 1 mês de idade, enquanto a pergunta tem ~ 3 anos.
Johnny Utahh 13/05

20
Acho que é muito mais eficaz fazer apenas:my_date.strftime('%A')
Nathan Tew

este salvou meu dia
Amol Bais



29

Resolvi isso para uma pergunta do 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

Uma solução sem importações para datas após 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 que precisamos de fazer aux + 100/400 em vez de aux / 400 você pode explicar
himanshu219

python3: apenas altere todos '/' com '//' na função acima e ele funcionará como um encanto.
chabir 22/04

11

Esta é uma solução se a data for um objeto datetime.

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

10

Se você tiver datas como uma sequência, pode ser mais fácil fazê-lo usando o carimbo de data e hora do panda

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

Resultado:

4 Friday

8

Às vezes, a biblioteca datetime fornece erros com strptime (), então mudei para a biblioteca dateutil. Aqui está um exemplo de como você pode usá-lo:

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

A saída que você obtém disso é 'Mon'. Se você deseja que a saída seja 'Segunda-feira', use o seguinte:

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

Isso funcionou para mim rapidamente. Eu estava tendo problemas ao usar a biblioteca de data e hora porque queria armazenar o nome do dia da semana em vez do número do dia da semana e o formato de usar a biblioteca de data e hora estava causando problemas. Se você não está tendo problemas com isso, ótimo! Se você é, você pode optar por isso, pois ele também possui uma sintaxe mais simples. Espero que isto ajude.


6

Supondo que você receba o dia, mês e ano, você pode:

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)

Não há necessidade de usar variedade dayl como você pode obter diretamente nome do dia, utilizando strftime("%A"), em vez deweekday()
Lekr0

5

Digamos que você tenha timeStamp: variável de sequência, AAAA-MM-DD HH: MM: SS

passo 1 : converta-o para a função dateTime com código de sopro ...

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

Etapa 2 : Agora você pode extrair todos os recursos necessários, como abaixo, que criarão uma nova coluna para cada hora, mês, dia da semana, ano, 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 você tiver motivos para evitar o uso do módulo datetime, essa função funcionará.

Nota: Presume-se que a mudança do calendário juliano para o gregoriano tenha ocorrido em 1582. Se isso não for verdade para o seu calendário de interesse, altere a linha se ano> 1582: adequadamente.

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 esforço! Você pode mover declarações, como as atribuindo a fge fj, dentro da condicional para evitar cálculos desnecessários.
Tom Russell

4

Se você não depende apenas do datetimemódulo, calendarpode ser uma alternativa melhor. Isso, por exemplo, fornecerá os códigos do dia:

calendar.weekday(2017,12,22);

E isso lhe dará o dia em si:

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

Ou no estilo python, como um liner:

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

3

Podemos ter ajuda do Pandas:

import pandas as pd

Como mencionado acima no problema, temos:

datetime(2017, 10, 20)

Se executar esta linha no notebook jupyter, temos uma saída como esta:

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

Usando weekday () e weekday_name:

Se você deseja dias da semana no formato de número inteiro, use:

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

A saída será:

4

E se você quiser como nome do dia, como domingo, segunda, sexta, etc, você pode usar:

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

A saída será:

'Friday'

Se tiver uma coluna de datas no quadro de dados do Pandas, então:

Agora, suponha que se você possui um dataframe do pandas com uma coluna de data 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]

Agora, se queremos saber o nome do dia da semana, como segunda, terça-feira, etc. etc, podemos usar .weekday_nameo seguinte:

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

a saída será:

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

E se quisermos o número inteiro de dias da semana nessa coluna Datas, podemos usar:

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

A saída terá a seguinte aparência:

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

Amostra de saída

08 05 2015
Friday

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

isso deve fornecer o número do seu dia real - 1 = domingo, 2 = segunda-feira, etc ...


Por que você usaria +1? É Senso comum que a weeknumbering em python começa em Sundat como 0 e segunda-feira como 1.
Nebulosar

2

Para obter domingo de 1 a sábado de 7, esta é a solução mais simples para sua pergunta:

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

Todos eles:

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

Resultado:

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

A pergunta pede domingo == 1, segunda-feira == 2 e sexta-feira == 6.
boi.

2

aqui está como converter uma lista de datas para data

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 o módulo Canlendar

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

1

Aqui está minha implementação 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)

0

Abaixo está o código para inserir a data no formato DD-MM-AAAA. Você pode alterar o formato de entrada alterando a ordem de '% d-% m-% Y' e também alterando o 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

use este código:

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

-1

importar numpy como np

data de definição (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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.