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)

Frazman
sumber

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.

Simeon Visser
sumber
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'
seddonym
sumber
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"))
Ashwini Chaudhary
sumber
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')
Arnaldo P. Figueira Figueira
sumber
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]
Rodrigo
sumber
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
Vlad Bezden
sumber
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.

Shashwat Siddhant
sumber
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)
mathwizurd
sumber
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)
Shiva_Achari
sumber
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
Barry Andersen
sumber
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)]
AnaCronIsm
sumber
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
Yogesh
sumber
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
nsky80
sumber
3
import datetime
int(datetime.datetime.today().strftime('%w'))+1

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

neoghost
sumber
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
lembu.
sumber
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)
Brij Bhushan Nanda
sumber
1

Menggunakan Modul Canlendar

import calendar
a=calendar.weekday(year,month,day)
days=["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]
print(days[a])
Ravi Bhushan
sumber
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)
Lasith Niroshan
sumber
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.")
Satyam Anand
sumber
-1

gunakan kode ini:

import pandas as pd
from datetime import datetime
print(pd.DatetimeIndex(df['give_date']).day)
Ya ampun kumar
sumber
-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
Thamaraikannan G
sumber