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)

Frazman
źródło

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.

Simeon Visser
źródło
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'
seddonym
źródło
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"))
Ashwini Chaudhary
źródło
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')
Arnaldo P. Figueira Figueira
źródło
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]
Rodrigo
źródło
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
Vlad Bezden
źródło
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.

Shashwat Siddhant
źródło
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)
mathwizurd
źródło
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)
Shiva_Achari
źródło
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
Barry Andersen
źródło
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)]
AnaCronIsm
źródło
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
Jogesh
źródło
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
nsky80
źródło
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 ...

neoghost
źródło
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
wół.
źródło
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)
Brij Bhushan Nanda
źródło
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])
Ravi Bhushan
źródło
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)
Lasith Niroshan
źródło
-1

użyj tego kodu:

import pandas as pd
from datetime import datetime
print(pd.DatetimeIndex(df['give_date']).day)
Jeevan Kumar
źródło
-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
Thamaraikannan G.
źródło