Làm thế nào để tôi có được ngày trong tuần cho một ngày?


589

Tôi muốn tìm hiểu những điều sau đây: đưa ra một ngày ( datetimeđối tượng), ngày tương ứng trong tuần là gì?

Chẳng hạn, Chủ nhật là ngày đầu tiên, thứ Hai: ngày thứ hai .. vân vân

Và sau đó nếu đầu vào là một cái gì đó như ngày hôm nay.

Thí dụ

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

Đầu ra có thể 6(kể từ thứ sáu)

Câu trả lời:


937

Sử dụng weekday()( tài liệu ):

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

Từ tài liệu:

Trả về ngày trong tuần dưới dạng số nguyên, trong đó Thứ Hai là 0 và Chủ Nhật là 6.


342
Một điều quan trọng cần lưu ý là trong JavaScript 0 = Chủ nhật, Python bắt đầu bằng 0 = Thứ hai. Một cái gì đó mà tôi đã chạy vào, front-end vs back-end ..
radtek

4
Lịch toán học nói chung rất tệ bởi vì máy tính không biết PTO là gì. Trong một nỗ lực để tránh dạy chúng, tôi rất khuyến khích các chức năng che giấu xác định xem hiện tại là ngày nghỉ hay cuối tuần.
meawoppl

11
Có lẽ bởi vì OP nói "Ví dụ", "đại loại như" và "có thể".
Eugene

10
Nếu bạn thích Chủ nhật là ngày 0:int(datetime.datetime.today().strftime('%w'))
mrooney

19
Để bắt đầu từ 1, chúng ta có thể sử dụng ngày thứ tư thay cho ngày trong tuần; 1 = Thứ Hai
Aman Kumar

289

Nếu bạn muốn có một ngày bằng tiếng Anh:

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

1
Đây dường như là câu trả lời tốt nhất để tạo ra tiếng Anh, ngày trong tuần. Tôi đoán nó không được nâng cao hơn đơn giản vì câu trả lời là ~ 1 tháng tuổi, trong khi câu hỏi là ~ 3 tuổi.
Johnny Utahh

20
Tôi thấy hiệu quả hơn nhiều khi chỉ cần làmmy_date.strftime('%A')
Nathan Tew

điều này đã cứu ngày của tôi
Amol Bais



29

Tôi đã giải quyết điều này cho một câu hỏi 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

Một giải pháp không nhập khẩu cho ngày sau 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')

tại sao chúng ta cần phải làm phụ trợ + 100/400 thay vì phụ trợ / 400, bạn có thể giải thích
himanshu219

python3: chỉ cần thay đổi tất cả '/' bằng '//' trong hàm trên và nó sẽ hoạt động như một bùa mê.
chabir

11

Đây là một giải pháp nếu ngày là một đối tượng datetime.

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

10

Nếu bạn có ngày dưới dạng chuỗi, có thể dễ dàng hơn khi sử dụng Dấu thời gian của gấu trúc

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

Đầu ra:

4 Friday

8

thư viện datetime đôi khi đưa ra lỗi với strptime () vì vậy tôi đã chuyển sang thư viện dateutil. Đây là một ví dụ về cách bạn có thể sử dụng nó:

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

Đầu ra mà bạn nhận được từ đây là 'Mon'. Nếu bạn muốn đầu ra là 'Thứ hai', hãy sử dụng như sau:

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

Điều này làm việc cho tôi khá nhanh chóng. Tôi gặp vấn đề trong khi sử dụng thư viện datetime vì tôi muốn lưu trữ tên ngày trong tuần thay vì số ngày trong tuần và định dạng từ việc sử dụng thư viện datetime đã gây ra sự cố. Nếu bạn không gặp vấn đề với điều này, thật tuyệt! Nếu là bạn, bạn chắc chắn sẽ thực hiện điều này vì nó có cú pháp đơn giản hơn. Hi vọng điêu nay co ich.


6

Giả sử bạn được cung cấp ngày, tháng và năm, bạn có thể làm:

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)

Không cần sử dụng mảng DayL vì bạn có thể trực tiếp lấy tên ngày bằng cách sử dụng strftime("%A")thay vìweekday()
Lekr0

5

Giả sử bạn có timeStamp: Biến chuỗi, YYYY-MM-DD HH: MM: SS

Bước 1 : chuyển đổi nó thành chức năng dateTime với mã thổi ...

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

Bước 2 : Bây giờ bạn có thể trích xuất tất cả các tính năng cần thiết như dưới đây sẽ tạo Cột mới cho mỗi fild- giờ, tháng, ngày trong tuần, năm, ngày

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

Nếu bạn có lý do để tránh sử dụng mô đun datetime, thì chức năng này sẽ hoạt động.

Lưu ý: Việc thay đổi từ lịch Julian sang lịch Gregorian được cho là xảy ra vào năm 1582. Nếu điều này không đúng với lịch bạn quan tâm thì hãy thay đổi dòng nếu năm> 1582: tương ứng.

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' cho nỗ lực! Bạn có thể di chuyển các câu lệnh, giống như các câu lệnh được gán cho fgfj, bên trong điều kiện để ngăn các phép tính không cần thiết.
Tom Russell

4

Nếu bạn không chỉ phụ thuộc vào datetimemô-đun, calendarcó thể là một sự thay thế tốt hơn. Điều này, ví dụ, sẽ cung cấp cho bạn mã ngày:

calendar.weekday(2017,12,22);

Và điều này sẽ cung cấp cho bạn ngày:

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

Hoặc theo phong cách của trăn, như một lớp lót:

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

3

Chúng tôi có thể giúp đỡ Pandas:

import pandas as pd

Như đã đề cập ở trên trong vấn đề Chúng tôi có:

datetime(2017, 10, 20)

Nếu thực thi dòng này trong sổ ghi chép jupyter, chúng ta có một đầu ra như thế này:

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

Sử dụng dayday () và weekday_name:

Nếu bạn muốn các ngày trong tuần ở định dạng số nguyên thì hãy sử dụng:

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

Đầu ra sẽ là:

4

Và nếu bạn muốn nó là tên của ngày như Chủ nhật, Thứ Hai, Thứ Sáu, v.v. bạn có thể sử dụng:

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

Đầu ra sẽ là:

'Friday'

Nếu có một cột ngày trong khung dữ liệu Pandas thì:

Bây giờ, giả sử nếu bạn có một khung dữ liệu gấu trúc có cột ngày như thế này: 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]

Bây giờ Nếu chúng ta muốn biết tên của các ngày trong tuần như Thứ Hai, Thứ Ba, ..vv, chúng ta có thể sử dụng .weekday_namenhư sau:

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

đầu ra sẽ là:

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

Và nếu chúng ta muốn số nguyên của ngày trong tuần từ cột Ngày này thì chúng ta có thể sử dụng:

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

Đầu ra sẽ như thế này:

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

Mẫu đầu ra

08 05 2015
Friday

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

điều này sẽ cung cấp cho bạn số ngày thực của bạn - 1 = chủ nhật, 2 = thứ hai, v.v ...


Tại sao bạn sẽ sử dụng +1? Thông thường, số tuần trong số trăn bắt đầu từ sundat là 0 và thứ hai là 1.
Nebulosar

2

Để có được Chủ nhật từ 1 đến Thứ Bảy là 7, đây là giải pháp đơn giản nhất cho câu hỏi của bạn:

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

Tất cả bọn họ:

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

Đầu ra:

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

Câu hỏi yêu cầu cho Chủ nhật == 1, Thứ hai == 2 và Thứ sáu == 6.
ox.

2

Dưới đây là cách chuyển đổi danh sách ngày thành ngày

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

Sử dụng mô-đun Canlendar

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

1

Đây là triển khai python3 của tôi.

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

Dưới đây là mã để nhập ngày theo định dạng DD-MM-YYYY, bạn có thể thay đổi định dạng đầu vào bằng cách thay đổi thứ tự '% d-% m-% Y' và cũng bằng cách thay đổi dấu phân cách.

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

sử dụng mã này:

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

-1

nhập numpy như np

ngày 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.