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)

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.


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'

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



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

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

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]

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

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.


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)

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)

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

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

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

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

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

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


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

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)

1

Verwenden des Canlendar-Moduls

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

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)

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

-1

Verwenden Sie diesen Code:

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

-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.