我想了解以下内容:给定一个日期(datetime对象),一周中对应的日期是什么?

例如,星期天是第一天,星期一是第二天。。等等

然后如果输入的内容类似于今天的日期。

实例

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

产量可能是6(因为现在是星期五)


当前回答

datetime库有时会出现strptime()错误,所以我切换到dateutil库。下面是一个如何使用它的示例:

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

您从中获得的输出是“Mon”。如果希望输出为“星期一”,请使用以下命令:

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

这对我很快奏效。我在使用日期时间库时遇到了问题,因为我想存储工作日名称而不是工作日编号,而使用日期时间的格式导致了问题。如果你对此没有问题,那太好了!如果你是这样的话,你可以明确地这样做,因为它的语法也更简单。希望这有帮助。

其他回答

我们可以帮助熊猫:

import pandas as pd

如上所述,我们有:

datetime(2017, 10, 20)

如果在jupyter笔记本中执行这一行,我们将得到如下输出:

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

使用weekday()和weekday_name:

如果您希望工作日为整数格式,请使用:

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

输出将为:

4

如果你想把它作为一天的名字,比如星期天、星期一、星期五等,你可以使用:

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

输出将为:

'星期五'

如果Pandas数据帧中有日期列,则:

现在假设您有一个panda数据帧,其日期列如下: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]

现在,如果我们想知道工作日的名称,比如星期一、星期二。。等等,我们可以按如下方式使用.weekday_name:

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

输出将是:

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

如果我们希望从“日期”列中得到工作日的整数,那么我们可以使用:

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

输出将如下所示:

0    3
1    4
2    5
3    6
4    0
Name: Dates, dtype: int64

要让星期天1点到星期六7点,这是解决问题的最简单方法:

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

所有这些:

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

输出:

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

如果您希望生成一个包含日期范围(Date)的列,并生成一个指向第一个日期并指定周日(Week Day)的列(我将使用从2008-01-01到2020-02-01的日期):

import pandas as pd
dr = pd.date_range(start='2008-01-01', end='2020-02-1')
df = pd.DataFrame()
df['Date'] = dr
df['Week Day'] = pd.to_datetime(dr).weekday

输出如下:

工作日从0到6不等,其中0对应于周一,6对应于周日。

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

如果您不完全依赖datetime模块,日历可能是更好的选择。例如,这将为您提供日期代码:

calendar.weekday(2017,12,22);

这将给你一天:

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

或者以python的风格,作为一行:

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