Wie bekomme ich den Wochentag mit einem Datum?

589

Ich möchte Folgendes herausfinden: datetimeWas ist bei einem bestimmten Datum ( Objekt) der entsprechende Wochentag?

Zum Beispiel ist Sonntag der erste Tag, Montag: der zweite Tag ... und so weiter

Und dann, wenn die Eingabe so etwas wie das heutige Datum ist.

Beispiel

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

Die Ausgabe ist vielleicht 6(da es Freitag ist)

frazman
quelle

Antworten:

937

Verwendung weekday()( docs ):

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

Aus der Dokumentation:

Geben Sie den Wochentag als Ganzzahl zurück, wobei Montag 0 und Sonntag 6 ist.

Simeon Visser
quelle
342
Eine wichtige Sache zu beachten ist, dass in JavaScript 0 = Sonntag Python mit 0 = Montag beginnt. Etwas, auf das ich
gestoßen
4
Kalendermathematik ist im Allgemeinen scheiße, weil Computer nicht wissen, was Zapfwelle ist. Um sie nicht zu unterrichten, empfehle ich dringend, Funktionen zu verschleiern, die bestimmen, ob es sich derzeit um einen Feiertag oder ein Wochenende handelt.
Meawoppl
11
Wahrscheinlich, weil das OP "Zum Beispiel", "so etwas wie" und "vielleicht" sagt.
Eugene
10
Wenn Sie int(datetime.datetime.today().strftime('%w'))
möchten
19
Um bei 1 zu beginnen, können wir isoweekday anstelle von Wochentag verwenden. 1 = Montag
Aman Kumar
289

Wenn Sie das Datum auf Englisch haben möchten:

from datetime import date
import calendar
my_date = date.today()
calendar.day_name[my_date.weekday()]  #'Wednesday'
seddonym
quelle
1
Dies scheint die beste Antwort zu sein, um ein englisches Wochentagsdatum zu generieren. Ich vermute, es wird nicht einfacher bewertet, weil die Antwort ~ 1 Monat alt ist, während die Frage ~ 3 Jahre alt ist.
Johnny Utahh
20
Ich finde es viel effektiver, es einfach zu tunmy_date.strftime('%A')
Nathan Tew
das rettete meinen Tag
Amol Bais
45

Verwenden Sie date.weekday()oder date.isoweekday().

orlp
quelle
7
Da die Operation in Bezug auf ein datetimeObjekt (kein dateObjekt) gefragt wurde, möchte ich erwähnen, dass die datetimeKlasse das gleiche weekday()und die gleichen isoweekday()Methoden aufweist.
Jens
29

Ich habe dies für eine CodeChef- Frage gelöst .

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

Eine Lösung ohne Importe für Daten nach 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
quelle
Warum müssen wir Aux +
100/400
python3: ändere einfach alle '/' mit '//' in der obigen Funktion und es wird wie ein Zauber funktionieren.
Chabir
11

Dies ist eine Lösung, wenn das Datum ein Datum / Uhrzeit-Objekt ist.

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

Wenn Sie Datumsangaben als Zeichenfolge haben, ist es möglicherweise einfacher, dies mit dem Zeitstempel von pandas zu tun

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

Ausgabe:

4 Friday
Vlad Bezden
quelle
8

Die datetime-Bibliothek gibt manchmal Fehler mit strptime () aus, daher habe ich zur dateutil-Bibliothek gewechselt. Hier ist ein Beispiel, wie Sie es verwenden können:

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

Die Ausgabe, die Sie daraus erhalten, ist 'Mon'. Wenn Sie die Ausgabe als "Montag" wünschen, verwenden Sie Folgendes:

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

Das hat bei mir ziemlich schnell geklappt. Ich hatte Probleme bei der Verwendung der datetime-Bibliothek, weil ich den Wochentagsnamen anstelle der Wochentagsnummer speichern wollte und das Format bei der Verwendung der datetime-Bibliothek Probleme verursachte. Wenn Sie damit keine Probleme haben, großartig! Wenn ja, können Sie dies auf jeden Fall tun, da es auch eine einfachere Syntax hat. Hoffe das hilft.

Shashwat Siddhant
quelle
6

Angenommen, Sie erhalten den Tag, den Monat und das Jahr, könnten Sie Folgendes tun:

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
quelle
Es ist nicht erforderlich, ein DayL-Array zu verwenden, da Sie den Tagesnamen direkt abrufen können, indem Sie strftime("%A")anstelle vonweekday()
Lekr0
5

Angenommen, Sie haben timeStamp: String-Variable, JJJJ-MM-TT HH: MM: SS

Schritt 1 : Konvertieren Sie es in die dateTime-Funktion mit Blow-Code ...

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

Schritt 2 : Jetzt können Sie alle erforderlichen Funktionen wie folgt extrahieren, um eine neue Spalte für jede Stunde, jeden Monat, jeden Wochentag, jedes Jahr und jedes Datum zu erstellen

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

Wenn Sie Grund haben, die Verwendung des datetime-Moduls zu vermeiden, funktioniert diese Funktion.

Hinweis: Es wird angenommen, dass der Wechsel vom julianischen zum gregorianischen Kalender im Jahr 1582 erfolgt ist. Wenn dies für Ihren interessierenden Kalender nicht zutrifft, ändern Sie die Zeile, wenn Jahr> 1582: entsprechend.

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
quelle
1
'A' für Mühe! Sie können Anweisungen, wie die, die fgund zuweisen fj, innerhalb der Bedingung verschieben, um unnötige Berechnungen zu vermeiden.
Tom Russell
4

Wenn Sie nicht nur auf das datetimeModul angewiesen sind , ist dies calendarmöglicherweise eine bessere Alternative. So erhalten Sie beispielsweise die Tagescodes:

calendar.weekday(2017,12,22);

Und das wird dir den Tag selbst geben:

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

Oder im Stil von Python als Einzeiler:

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

Wir können Pandas helfen:

import pandas as pd

Wie oben im Problem erwähnt Wir haben:

datetime(2017, 10, 20)

Wenn Sie diese Zeile im Jupyter-Notizbuch ausführen, haben wir eine Ausgabe wie folgt:

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

Verwenden von Wochentag () und Wochentagsname:

Wenn Sie Wochentage im Ganzzahlformat möchten, verwenden Sie:

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

Die Ausgabe wird sein:

4

Und wenn Sie es als Namen des Tages wie Sonntag, Montag, Freitag usw. möchten, können Sie Folgendes verwenden:

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

Die Ausgabe wird sein:

'Friday'

Wenn Sie eine Datumsspalte im Pandas-Datenrahmen haben, dann:

Angenommen, Sie haben einen Pandas-Datenrahmen mit einer Datumsspalte wie dieser: 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]

Wenn wir den Namen des Wochentags wie Montag, Dienstag usw. wissen möchten, können wir .weekday_nameFolgendes verwenden:

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

Die Ausgabe lautet:

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

Und wenn wir die Ganzzahl des Wochentags aus dieser Datumsspalte wollen, können wir verwenden:

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

Die Ausgabe sieht folgendermaßen aus:

0    3
1    4
2    5
3    6
4    0
Name: Dates, dtype: int64
Yogesh
quelle
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()])

Ausgabebeispiel

08 05 2015
Friday
nsky80
quelle
3
import datetime
int(datetime.datetime.today().strftime('%w'))+1

Dies sollte Ihnen Ihre tatsächliche Tageszahl geben - 1 = Sonntag, 2 = Montag usw.

neoghost
quelle
Warum würden Sie verwenden +1? Es ist üblich, dass die Wochennummer in Python bei Sundat als 0 und Montag als 1 beginnt.
Nebulosar
2

Um Sonntag als 1 bis Samstag als 7 zu erhalten, ist dies die einfachste Lösung für Ihre Frage:

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

Alle von ihnen:

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

Ausgabe:

1 == Sunday
2 == Monday
3 == Tuesday
4 == Wednesday
5 == Thursday
6 == Friday
7 == Saturday
Ochse.
quelle
Die Frage fragt nach Sonntag == 1, Montag == 2 und Freitag == 6.
Ochse.
2

Hier erfahren Sie, wie Sie eine Liste mit aktuellen Daten konvertieren

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

Verwenden des Canlendar-Moduls

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

Hier ist meine Python3-Implementierung.

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

Unten finden Sie den Code zur Eingabe des Datums im Format TT-MM-JJJJ. Sie können das Eingabeformat ändern, indem Sie die Reihenfolge von '% d-% m-% Y' und auch das Trennzeichen ändern.

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

Verwenden Sie diesen Code:

import pandas as pd
from datetime import datetime
print(pd.DatetimeIndex(df['give_date']).day)
Jeevan Kumar
quelle
-1

importiere numpy als 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 df
Thamaraikannan G.
quelle