如何找到一个月中最常见的日期名称?

How to find the most common day name in a month?

有没有办法将指定月份和年份中出现最频繁的星期几打印为字符串。像 MondayTuesday 一样,如果有多天,应该显示第一天。

首先我尝试检查 datetime 输出但无法找到日历模块来将其作为日输出。

import calendar

def usingcalendar(datetuple):
    l = []
    dt=list(datetuple)
    obj = calendar.Calendar()
    for day in obj.itermonthdates(dt[0], dt[1]):
        l.append(day)
    rev = l[:-8:-1]
    rev.reverse()
    print(rev)

我试图使用 calendar.itermonthdays 来获取所需的迭代器,以使用它来显示像 'Monday'、星期二这样的日子。但只到此为止

[datetime.date(2020, 2, 24), datetime.date(2020, 2, 25), datetime.date(2020, 2, 26), 
 datetime.date(2020, 2, 27), datetime.date(2020, 2, 28), datetime.date(2020, 2, 29), 
 datetime.date(2020, 3, 1)]

我猜你应该考虑使用 pandas 以防出现多个重复值

import pandas as pd 
List = [2, 1, 2, 2, 1, 3, 1] 
  
# Create a panda DataFrame using the list 
df=pd.DataFrame({'Number': List}) 
  
# Creating a new dataframe to store the values with appropriate column name 
# value_counts() returns the count based on the grouped column values  
df1 = pd.DataFrame(data=df['Number'].value_counts(), columns=[['Number','Count']]) 
  
# The values in the List become the index of the new dataframe.Setting these index as a column 
df1['Count']=df1['Number'].index 
  
# Fetch the list of frequently repeated columns  
list(df1[df1['Number']==df1.Number.max()]['Count']) 

输出

[2,1]

在您的场景中使用此示例!

您可以为此使用 collections.Counter。您可以为给定的年份和月份调用日历的 itermonthdates,然后使用 datetime.

'%A' 格式说明符创建工作日名称的 Counter
import calendar
from collections import Counter

cal = calendar.Calendar()
year = 2020
month = 1
count = Counter(d.strftime('%A') for d in cal.itermonthdates(year, month) if d.month==month)

然后举例

>>> count
Counter({'Wednesday': 5, 'Thursday': 5, 'Friday': 5, 'Saturday': 4, 'Sunday': 4, 'Monday': 4, 'Tuesday': 4})
>>> count.most_common(1)
[('Wednesday', 5)]

您只需要从每月 29 日到 31 日的任何有效日期的日期名称。如果其中任何一个不是有效日期,请停止尝试。

import datetime

def get_most_common_days(year, month):
    days = []
    for daynum in range(29, 32):
        try:
            days.append(datetime.date(year, month, daynum).strftime('%A'))
        except ValueError:
            break
    return days

print(get_most_common_days(2020, 8))

这给出了

['Saturday', 'Sunday', 'Monday']

2020 年 8 月最常见的日子。出现 5 次。未列出的日期出现4次

新手程序员:

我试图解决完全相同的问题。我想出了这个解决方案并且有效。

import calendar
import collections.defaultdict as dd

days_count = dd(int)

obj = calendar.Calendar()

days = [x for x in obj.itermonthdays2(year,month)]


for day in days:
    if day[0] != 0:  #these are empty days in a monthly calendar
        days_count[day[1]] += 1

max_day = max(days_count, key=days_count.get)

这将给出一个整数值(0=星期一,1=星期二,... 6=星期日)。 您可以使用函数或字典将整数转换为工作日的字符串表示形式。

仅供参考:此解决方案给出了第一个出现的工作日,以防出现多个最常出现的工作日

这是我的回答,似乎有效-

import calendar 
from collections import Counter


obj = calendar.Calendar()

my_list1 = []
for i in obj.itermonthdays2(year, month):
    if i[0] == 0:
        pass
    else:
        my_list1.append(str(i[1]))

int_values = []
for i in my_list1:
    int_values.append(int(i))

num = Counter(int_values)
num = num.most_common(1)[0][0]
if num == 0:
    print("Monday")
if num == 1:
    print("Tuesday")
if num == 2:
    print("Wednesday")
if num == 3:
    print("Thursday")
if num == 4:
    print("Friday")
if num == 5:
    print("Saturday")
if num == 6:
    print("Sunday")

最后的部分有点长,但我找不到任何方法来克服它。

我相信这应该有效。 29日哪一天来,一个月来5次,先来。 如果是闰年,所有的日子都会来4次,所以星期一应该是一周的第一天。

import datetime

try:
    print(datetime.date(year, month,29).strftime('%A'))
except ValueError:
    print("Monday")
#!/bin/python3

import math
import os
import random
import re
import sys    
import calendar
import datetime
from collections import Counter

def usingcalendar(datetuple):
    # Write your code here
    year = datetuple[0]
    temp = list(datetuple)
    if (year%4==0):
        temp[1] = 2
        datetuple = tuple(temp)
    print(calendar.month(datetuple[0],datetuple[1]))

    obj = calendar.Calendar()
    l = []
    dt=list(datetuple)
    obj = calendar.Calendar()
    for day in obj.itermonthdates(dt[0], dt[1]):
        l.append(day)
    rev = l[:-8:-1]
    rev.reverse()
    print(rev)

    try:
        print(datetime.date(datetuple[0],datetuple[1],29).strftime('%A'))
    except ValueError:
        print("Monday")

if __name__ == '__main__':
    qw1 = []

    for _ in range(3):
        qw1_item = int(input().strip())
        qw1.append(qw1_item)
        
    tup=tuple(qw1)

    usingcalendar(tup)

查找该月第一天的工作日。显然,每个月的第一天所在的工作日出现频率最高。

如果有好几天也没关系,因为它们只会在这之后出现,我们只需要找到第一天。

from datetime import datetime

month, year = 2, 2020 
first_date = datetime(month=2, year=2020, day=1)
first_most_frequent_weekday = first_date.strftime("%A")
print(first_most_frequent_weekday)  # Saturday