Haftanın gününü nasıl tarih alabilirim?


589

Aşağıdakileri bulmak istiyorum: bir tarih ( datetimenesne) verildiğinde , haftanın ilgili günü nedir?

Örneğin, Pazar ilk gün, Pazartesi: ikinci gün .. vb.

Ve sonra girdi bugünün tarihi gibi bir şeyse.

Misal

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

Çıktı belki 6(Cuma gününden beri)

Yanıtlar:


937

Kullanım weekday()( dokümanlar ):

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

Belgelerden:

Haftanın gününü, Pazartesi 0 ve Pazar 6 olmak üzere tamsayı olarak döndürün.


342
Dikkat edilmesi gereken önemli bir nokta, JavaScript 0 = Pazar'da Python'un 0 = Pazartesi ile başlamasıdır. Karşılaştığım bir şey, ön uç vs arka uç ..
radtek

4
Takvim matematik genellikle berbat çünkü bilgisayarlar PTO'nun ne olduğunu bilmiyor. Onları öğretmekten kaçınmak için, şu anda bir tatil mi yoksa hafta sonu mı olduğunu belirleyen işlevleri gizlemenizi tavsiye ederim.
meawoppl

11
Muhtemelen OP "Örneğin", "ve" belki "gibi bir şey söylüyor.
Eugene

10
Pazar gününün 0 olmasını isterseniz:int(datetime.datetime.today().strftime('%w'))
mrooney

19
1'den başlamak için hafta içi yerine isoweekday'ı kullanabiliriz; 1 = Pazartesi
Aman Kumar

289

Tarihin İngilizce olmasını istiyorsanız:

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

1
Bu, İngilizce haftanın günü için en iyi yanıt gibi görünüyor. Daha basit bir şekilde değerlendirilmediğini tahmin ediyorum çünkü cevap ~ 1 aylıkken, soru ~ 3 yaşında.
Johnny Utahh

20
Sadece yapmanın çok daha etkili olduğunu düşünüyorummy_date.strftime('%A')
Nathan Tew

Bu günümü kurtardı
Amol Bais



29

Bir CodeChef sorusu için bunu çözdüm .

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

1700/1/1 tarihinden sonraki ithalatlar için bir çözüm

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

neden aux / 400 yerine aux + 100/400 yapmalıyız lütfen açıklayabilir misiniz
himanshu219

python3: yukarıdaki fonksiyondaki tüm '/' ile '//' değiştirin ve bir cazibe gibi çalışacaktır.
chabir

11

Tarih datetime nesnesiyse bu bir çözümdür.

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

10

Dizgi olarak tarihleriniz varsa, pandaların Zaman Damgası'nı kullanarak bunu yapmak daha kolay olabilir

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

Çıktı:

4 Friday

8

datetime kütüphanesi bazen strptime () ile hata verir, bu yüzden dateutil kütüphanesine geçtim. İşte onu nasıl kullanabileceğinize dair bir örnek:

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

Bundan elde ettiğiniz çıktı 'Mon'. Çıktının 'Pazartesi' olmasını istiyorsanız aşağıdakileri kullanın:

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

Bu benim için çok hızlı çalıştı. Datetime kütüphanesini kullanırken sorun yaşıyordum çünkü hafta içi numarası yerine hafta içi adını saklamak istedim ve datetime kütüphanesini kullanmaktan kaynaklanan format sorunlara neden oluyordu. Bununla ilgili sorun yaşamıyorsanız, harika! Eğer öyleyse, daha basit bir sözdizimine sahip olduğu için kesinlikle bunun için gidersiniz. Bu yardımcı olur umarım.


6

Size gün, ay ve yıl verildiğini varsayarsak, şunları yapabilirsiniz:

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)

Doğrudan kullanarak gün adını almak gibi Dayl dizi kullanmanın gerek yoktur strftime("%A")yerineweekday()
Lekr0

5

TimeStamp'ınız olduğunu varsayalım: String değişkeni, YYYY-AA-GG SS: DD: SS

Adım 1 : darbe koduyla dateTime işlevine dönüştürün ...

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

Adım 2 : Artık tüm gerekli özellikleri ayıklama, ay, haftanın günü, yıl, tarih için yeni Sütun oluşturacak şekilde aşağıdaki gibi ayıklayabilirsiniz.

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

Datetime modülünün kullanılmasını önlemek için nedeniniz varsa, bu işlev çalışır.

Not: Julian'dan Gregoryen takvimine yapılan değişikliğin 1582'de gerçekleştiği varsayılmaktadır. İlgilenilen takvim için bu doğru değilse yıl> 1582 ise satırı değiştirin : buna göre.

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
Çaba için 'A'! Sen hiç atama olduğu gibi, ifadeleri taşımak olabilir fgve fjgereksiz hesaplamaları önlemek için koşullu içinde.
Tom Russell

4

Yalnızca datetimemodüle bağımlı değilseniz , calendardaha iyi bir alternatif olabilir. Bu, örneğin, gün kodlarını sağlayacaktır:

calendar.weekday(2017,12,22);

Ve bu size günün kendisini verecektir:

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

Veya tek bir astar olarak python tarzında:

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

3

Pandalardan yardım alabiliriz:

import pandas as pd

Yukarıda belirtildiği gibi sorun var:

datetime(2017, 10, 20)

Jupyter not defterinde bu satırı çalıştırırsak, şöyle bir çıktıya sahibiz:

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

Weekday () ve weekday_name kullanma:

Hafta içi günleri tamsayı biçiminde istiyorsanız şunu kullanın:

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

Çıktı şöyle olacaktır:

4

Ve eğer Pazar, Pazartesi, Cuma, vb.Gibi günün adı olarak istiyorsanız:

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

Çıktı şöyle olacaktır:

'Friday'

Pandalar veri çerçevesinde bir tarih sütunu varsa:

Şimdi, böyle bir tarih sütununa sahip bir panda veri çerçeveniz olduğunu varsayalım: 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]

Şimdi Pazartesi, Salı, ..etc gibi haftanın gününün adını bilmek istiyorsak .weekday_nameaşağıdaki gibi kullanabiliriz :

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

çıktı:

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

Ve bu Tarihler sütunundan hafta içi tam sayı sayısını istiyorsak şunu kullanabiliriz:

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

Çıktı şöyle görünecektir:

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

Çıktı Örneği

08 05 2015
Friday

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

bu size gerçek gün numaranızı vermelidir - 1 = pazar, 2 = pazartesi, vb ...


Neden kullanırsın +1? Python'daki hafta numaralandırması 0'da ve pazartesi 1'de başlar.
Nebulosar

2

Pazar gününü 1'den cumartesiye 7 olarak almak için, sorunuzun en basit çözümü budur:

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

Hepsi:

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

Çıktı:

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

Soru Pazar == 1, Pazartesi == 2 ve Cuma == 6.
öküz.

2

İşte bir listof tarihlerini tarihe nasıl çevireceğiniz

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

Canlendar Modülünü Kullanma

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

1

İşte benim python3 uygulaması.

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

DD-AA-YYYY biçiminde tarih girmek için kullanılan kod, '% d-% m-% Y' sırasını değiştirerek ve ayrıca sınırlayıcıyı değiştirerek giriş biçimini değiştirebilirsiniz.

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

bu kodu kullan:

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

-1

np'yi np olarak içe aktar

def tarihi (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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.