Bagaimana saya mendapatkan hari dalam seminggu diberikan tanggal?


590

Saya ingin mencari tahu yang berikut: diberi tanggal (datetime objek), apa hari yang sesuai dalam seminggu?

Misalnya, hari Minggu adalah hari pertama, Senin: hari kedua .. dan seterusnya

Dan kemudian jika inputnya seperti tanggal hari ini.

Contoh

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

Outputnya mungkin 6(karena ini hari Jumat)

Jawaban:


938

Gunakan weekday()( dokumen ):

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

Dari dokumentasi:

Kembalikan hari dalam seminggu sebagai bilangan bulat, di mana Senin adalah 0 dan Minggu adalah 6.


342
Satu hal penting yang perlu diperhatikan adalah bahwa dalam JavaScript 0 = Minggu, Python dimulai dengan 0 = Senin. Sesuatu yang saya
temui

4
Kalender matematika umumnya payah karena komputer tidak tahu apa itu PTO. Dalam upaya untuk menghindari mengajar mereka, saya sangat merekomendasikan fungsi membingungkan yang menentukan apakah saat ini liburan atau akhir pekan.
meawoppl

11
Mungkin karena OP mengatakan "Misalnya", "sesuatu seperti" dan "mungkin".
Eugene

10
Jika Anda ingin hari Minggu menjadi hari 0:int(datetime.datetime.today().strftime('%w'))
mrooney

19
Untuk memulai dari 1, kita dapat menggunakan isoweekday di tempat hari kerja; 1 = Senin
Aman Kumar

289

Jika Anda ingin memiliki tanggal dalam bahasa Inggris:

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

1
Ini tampaknya menjadi jawaban terbaik untuk menghasilkan tanggal bahasa Inggris, hari-minggu. Saya kira itu tidak lebih dipilih karena jawabannya ~ 1 bulan, sedangkan pertanyaannya ~ 3 tahun.
Johnny Utahh

20
Saya merasa jauh lebih efektif untuk melakukannyamy_date.strftime('%A')
Nathan Tew

ini menyelamatkan hari saya
Amol Bais



29

Saya memecahkan ini untuk pertanyaan 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

Solusi tanpa impor untuk tanggal setelah 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')

mengapa kita perlu melakukan aux + 100/400 alih-alih aux / 400 dapat Anda jelaskan
himanshu219

python3: cukup ubah semua '/' dengan '//' pada fungsi di atas dan itu akan bekerja seperti pesona.
chabir

11

Ini adalah solusi jika tanggal adalah objek datetime.

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

10

Jika Anda memiliki tanggal sebagai string, mungkin lebih mudah melakukannya dengan menggunakan cap waktu panda

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

Keluaran:

4 Friday

8

pustaka datetime terkadang memberikan kesalahan dengan strptime () jadi saya beralih ke pustaka dateutil. Berikut ini contoh bagaimana Anda dapat menggunakannya:

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

Output yang Anda dapatkan dari ini adalah 'Mon'. Jika Anda ingin output sebagai 'Senin', gunakan yang berikut ini:

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

Ini bekerja untuk saya cukup cepat. Saya mengalami masalah saat menggunakan perpustakaan datetime karena saya ingin menyimpan nama hari kerja alih-alih nomor hari kerja dan format dari menggunakan perpustakaan datetime menyebabkan masalah. Jika Anda tidak memiliki masalah dengan ini, bagus! Jika ya, Anda dapat menggunakan ini karena memiliki sintaks yang lebih sederhana. Semoga ini membantu.


6

Dengan asumsi Anda diberikan hari, bulan, dan tahun, Anda dapat melakukan:

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)

Tidak perlu menggunakan array DayL karena Anda dapat langsung mendapatkan nama hari dengan menggunakan strftime("%A")alih-alihweekday()
Lekr0

5

Katakanlah Anda memiliki timeStamp: Variabel string, YYYY-MM-DD HH: MM: SS

langkah 1 : konversikan ke fungsi dateTime dengan kode tiup ...

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

Langkah 2 : Sekarang Anda dapat mengekstrak semua fitur yang diperlukan seperti di bawah ini yang akan membuat Kolom baru untuk setiap jam, bulan, hari dalam seminggu, tahun, tanggal

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

Jika Anda memiliki alasan untuk menghindari penggunaan modul datetime, maka fungsi ini akan berfungsi.

Catatan: Perubahan dari kalender Julian ke kalender Gregorian diasumsikan telah terjadi pada 1582. Jika ini tidak benar untuk kalender yang Anda minati maka ubah garis jika tahun> 1582: sesuai.

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' untuk usaha! Anda dapat memindahkan pernyataan, seperti yang ditugaskan ke fgdan fj, di dalam kondisi untuk mencegah perhitungan yang tidak perlu.
Tom Russell

4

Jika Anda tidak sepenuhnya bergantung pada datetimemodul, calendarmungkin merupakan alternatif yang lebih baik. Ini, misalnya, akan memberi Anda kode hari:

calendar.weekday(2017,12,22);

Dan ini akan memberi Anda hari itu sendiri:

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

Atau dalam gaya python, sebagai satu liner:

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

3

Kami dapat mengambil bantuan Panda:

import pandas as pd

Seperti disebutkan di atas dalam masalah Kami memiliki:

datetime(2017, 10, 20)

Jika menjalankan baris ini di notebook jupyter kami memiliki output seperti ini:

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

Menggunakan weekday () dan weekday_name:

Jika Anda ingin hari kerja dalam format angka integer, gunakan:

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

Outputnya adalah:

4

Dan jika Anda menginginkannya sebagai nama hari seperti Minggu, Senin, Jumat, dll, Anda dapat menggunakan:

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

Outputnya adalah:

'Friday'

Jika memiliki kolom tanggal dalam bingkai data Pandas, maka:

Sekarang anggaplah jika Anda memiliki kerangka data panda yang memiliki kolom tanggal seperti ini: 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]

Sekarang Jika kita ingin mengetahui nama hari kerja seperti Senin, Selasa, dll. Kita bisa menggunakan .weekday_namesebagai berikut:

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

hasilnya adalah:

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

Dan jika kita ingin bilangan bulat hari kerja dari kolom Tanggal ini maka kita dapat menggunakan:

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

Outputnya akan terlihat seperti ini:

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

Sampel Keluaran

08 05 2015
Friday

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

ini akan memberi Anda nomor hari Anda yang sebenarnya - 1 = minggu, 2 = Senin, dll ...


Mengapa Anda menggunakan +1? Sudah umum bahwa jumlah minggu dalam python dimulai pada minggu sebagai 0 dan Senin sebagai 1.
Nebulosar

2

Untuk mendapatkan hari Minggu 1 hingga Sabtu 7, ini adalah solusi paling sederhana untuk pertanyaan Anda:

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

Mereka semua:

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

Keluaran:

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

Pertanyaannya menanyakan hari Minggu == 1, Senin == 2, dan Jumat == 6.
sapi.

2

di sini adalah cara mengonversi daftar tanggal ke tanggal

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

Menggunakan Modul Canlendar

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

1

Berikut ini adalah implementasi python3 saya.

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

Di bawah ini adalah kode untuk memasukkan tanggal dalam format DD-MM-YYYY Anda dapat mengubah format input dengan mengubah urutan '% d-% m-% Y' dan juga dengan mengubah pembatas.

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

gunakan kode ini:

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

-1

impor numpy sebagai np

tanggal 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.