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)

Frazman
fonte

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.

Simeon Visser
fonte
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'
seddonym
fonte
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
45

Use date.weekday()ou date.isoweekday().

orlp
fonte
7
Como o op perguntou em relação a um datetimeobjeto (não a um dateobjeto), eu gostaria de mencionar que a datetimeclasse ostenta o mesmo weekday()e isoweekday()métodos.
Jens
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"))
Ashwini Chaudhary
fonte
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')
Arnaldo P. Figueira Figueira
fonte
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]
Rodrigo
fonte
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
Vlad Bezden
fonte
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.

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

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

use este código:

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