Jak mogę uzyskać datę tygodnia w dniu tygodnia?


589

Chcę dowiedzieć się, co następuje: biorąc pod uwagę datę ( datetimeobiekt), jaki jest odpowiedni dzień tygodnia?

Na przykład niedziela to pierwszy dzień, poniedziałek: drugi dzień ... i tak dalej

A jeśli dane wejściowe są jak dzisiejsza data.

Przykład

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

Wynik może być 6(ponieważ jest piątek)

Odpowiedzi:


936

Użyj weekday()( dokumenty ):

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

Z dokumentacji:

Zwróć dzień tygodnia jako liczbę całkowitą, gdzie poniedziałek to 0, a niedziela to 6.


342
Należy zauważyć, że w JavaScript 0 = niedziela, Python zaczyna się od 0 = poniedziałek. Coś, na co wpadłem, front-end vs back-end ..
radtek,

4
Matematyka kalendarza jest do kitu, ponieważ komputery nie wiedzą, co to jest WOM. Starając się ich nie uczyć, bardzo polecam zaciemnianie funkcji, które określają, czy jest to obecnie wakacje czy weekend.
meawoppl,

11
Prawdopodobnie dlatego, że PO mówi „na przykład”, „coś w stylu” i „może”.
Eugene

10
Jeśli chcesz, aby niedziela była dniem 0:int(datetime.datetime.today().strftime('%w'))
mrooney,

19
Aby zacząć od 1, możemy użyć isoweekday zamiast dnia tygodnia; 1 = poniedziałek
Aman Kumar

288

Jeśli chcesz mieć datę w języku angielskim:

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

1
To wydaje się być najlepszą odpowiedzią na wygenerowanie angielskiej daty dnia tygodnia. Domyślam się, że nie jest to bardziej uprzywilejowane, ponieważ odpowiedź ma ~ 1 miesiąc, a pytanie ~ 3 lata.
Johnny Utahh

20
Uważam, że jest to o wiele bardziej skutecznemy_date.strftime('%A')
Nathan Tew

to uratowało mi dzień
Amol Bais



29

Rozwiązałem to dla pytania 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

Rozwiązanie bez importu dla dat po 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')

dlaczego musimy zrobić Aux +
100/400

python3: po prostu zmień wszystkie '/' za pomocą '//' w powyższej funkcji i będzie działać jak urok.
chabir

11

Jest to rozwiązanie, jeśli data jest obiektem typu data-godzina.

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

10

Jeśli masz daty jako ciąg, łatwiej może to zrobić za pomocą znacznika czasu pandy

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

Wynik:

4 Friday

8

Biblioteka datetime czasami podaje błędy przy pomocy strptime (), więc przełączyłem się na bibliotekę dateutil. Oto przykład, jak możesz go użyć:

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

Dane wyjściowe z tego są 'Mon'. Jeśli chcesz otrzymać wynik jako „poniedziałek”, użyj następujących poleceń:

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

To działało dla mnie dość szybko. Miałem problemy podczas korzystania z biblioteki datetime, ponieważ chciałem zapisać nazwę dnia tygodnia zamiast numeru dnia tygodnia, a format korzystania z biblioteki datetime powodował problemy. Jeśli nie masz z tym problemów, świetnie! Jeśli tak, zdecydowanie skorzystasz z tego, ponieważ ma również prostszą składnię. Mam nadzieję że to pomoże.


6

Zakładając, że masz dzień, miesiąc i rok, możesz:

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)

Nie ma potrzeby używania tablicy DayL, ponieważ można bezpośrednio uzyskać nazwę dnia, używając strftime("%A")zamiastweekday()
Lekr0

5

Powiedzmy, że masz zmienną timeStamp: String, RRRR-MM-DD GG: MM: SS

krok 1 : przekonwertuj go na funkcję dateTime z kodem blow ...

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

Krok 2 : Teraz możesz wyodrębnić wszystkie wymagane funkcje, jak poniżej, które utworzą nową kolumnę dla każdej godziny, miesiąca, dnia tygodnia, roku, daty

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

Jeśli masz powód, aby unikać używania modułu datetime, ta funkcja będzie działać.

Uwaga: Zakłada się, że zmiana kalendarza juliańskiego na gregoriański nastąpiła w 1582 r. Jeśli nie jest to prawdą w przypadku twojego kalendarza zainteresowania, zmień linię, jeśli rok> 1582: odpowiednio.

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” za wysiłek! Możesz przenosić instrukcje, takie jak te przypisywane do fgi fj, wewnątrz warunkowego, aby zapobiec niepotrzebnym obliczeniom.
Tom Russell,

4

Jeśli nie polegasz wyłącznie na datetimemodule, calendarmoże być lepszą alternatywą. To na przykład zapewni kody dnia:

calendar.weekday(2017,12,22);

A to da ci sam dzień:

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

Lub w stylu python, jako jedna linijka:

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

3

Możemy skorzystać z pomocy Pand:

import pandas as pd

Jak wspomniano powyżej w problemie Mamy:

datetime(2017, 10, 20)

Jeśli wykonasz ten wiersz w notatniku jupyter, otrzymamy takie dane wyjściowe:

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

Używając weekday () i weekday_name:

Jeśli chcesz dni tygodnia w formacie liczb całkowitych, użyj:

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

Dane wyjściowe będą:

4

A jeśli chcesz, aby była to nazwa dnia, np. Niedziela, poniedziałek, piątek itp., Możesz użyć:

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

Dane wyjściowe będą:

'Friday'

Jeśli masz kolumnę dat w ramce danych Pandas, to:

Teraz załóżmy, że jeśli masz ramkę danych pandy o takiej kolumnie daty: pdExampleDataFrame ['Daty']. 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]

Teraz, jeśli chcemy poznać nazwę dnia tygodnia, np. Poniedziałek, wtorek, itp., Możemy użyć .weekday_namew następujący sposób:

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

wyjście będzie:

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

A jeśli chcemy liczby całkowitej dnia tygodnia z tej kolumny Daty, możemy użyć:

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

Dane wyjściowe będą wyglądać następująco:

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

Próbka wyjściowa

08 05 2015
Friday

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

to powinno dać ci twój prawdziwy numer dnia - 1 = niedziela, 2 = poniedziałek, itd ...


Dlaczego miałbyś skorzystać +1? Często zdarza się, że numeracja tygodniowa w pythonie rozpoczyna się w niedzielę jako 0, a w poniedziałek jako 1.
Nebulosar

2

Aby uzyskać niedzielę od 1 do soboty jako 7, jest to najprostsze rozwiązanie twojego pytania:

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

Wszyscy:

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

Wynik:

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

Pytanie dotyczy niedzieli == 1, poniedziałku == 2 i piątku == 6.
wół.

2

oto jak przekonwertować listę dat na datę

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

Korzystanie z modułu Canlendar

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

1

Oto moja implementacja 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)

-1

użyj tego kodu:

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

-1

zaimportuj numpy jako np

data 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.