从日期时间对象对工作日进行排序

时间:2020-09-08 10:26:35

标签: python django

我想从日期时间对象列表中获得每个相似星期的工作日。

示例:对于列表 [2020-08-17 07:00:00, 2020-08-28 05:00:00, 2020-08-17 09:00:00, 2020-08-18 09:00:00, 2020-08-24 02:00:00, 2020-08-27 02:00:00]

结果应为:

list_1 = ['Mon', 'Tue']
list_2 = ['Mon', 'Thu', 'Fri']

3 个答案:

答案 0 :(得分:1)

from datetime import datetime, timedelta
from collections import defaultdict

dates = ["2020-08-17 07:00:00", "2020-08-28 05:00:00", "2020-08-17 09:00:00", "2020-08-18 09:00:00", "2020-08-24 02:00:00", "2020-08-27 02:00:00"]

weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

# create a dictionary for storing each week's list
# default value for each entry is an empty list
weeks = defaultdict(list)

for dateString in dates:
  # create datetime object from list element
  date = datetime.strptime(dateString, '%Y-%m-%d %H:%M:%S')
  # get the weekday of the date
  weekday = weekdays[date.weekday()]
  # get the date of last Monday (for indexing weeks)
  weekMonday = (date - timedelta(days=date.weekday())).strftime("%Y-%m-%d")
  # add weekday to the corresponding week entry in the dict
  weeks[weekMonday].append(weekday)
  # sort and remove duplicates
  weeks[weekMonday] = list(sorted(set(weeks[weekMonday]), key=lambda x: weekdays.index(x)))

# print results
for x in weeks:
  print("Week of " + x + ":", weeks[x])

输出:

Week of 2020-08-17: ['Mon', 'Tue']
Week of 2020-08-24: ['Mon', 'Thu', 'Fri']

您可以通过提供该周星期一的日期来访问每个列表,例如:

print(weeks["2020-08-17"])  # ['Mon', 'Tue']

答案 1 :(得分:0)

这会将日期转换为星期几(0-6):

import datetime

dates = ['2020-08-17 07:00:00', '2020-08-17 09:00:00', '2020-08-18 09:00:00', '2020-08-24 02:00:00', '2020-08-27 02:00:00', '2020-08-28 05:00:00']

dates = [datetime.datetime(int(item[0:4]), int(item[5:7]), int(item[8:9])) for item in dates]

days = [date.weekday() for date in dates]
weeks = [date.isocalendar()[1] for date in dates]

counts = {}

for i in range(len(days)):
    if weeks[i] in counts:
        if not(days[i] in counts[weeks[i]]):
            counts[weeks[i]].append(days[i])

    else:
        counts[weeks[i]] = [days[i]]

答案 2 :(得分:0)

使用字典来有效跟踪一周中的日子:

from dateutil import parser

# The given dates as strings
sabich = [ '2020-08-17 07:00:00' , '2020-08-28 05:00:00' , '2020-08-17 09:00:00' , '2020-08-18 09:00:00' , '2020-08-24 02:00:00' , '2020-08-27 02:00:00' ]

weeks_dates = dict()

# Loop on the given dates as strings
for ds in sabich:
    # Parse date from string o datetime object
    dt = parser.parse(ds)
    # Find date's week in year
    week_in_year = dt.isocalendar()[1]
    # Find date's day in week name
    date_day_name = dt.strftime("%A")
    # If week doesn't exists as key (no days of that date existed)
    if week_in_year not in weeks_dates.keys():
        # Create list to add the date names to that list
        weeks_dates[week_in_year] = []
    # Append the date week day name
    weeks_dates[week_in_year].append(date_day_name)

# Printing the days names for each week
for week_in_year in weeks_dates.keys():
    print(f'Week number {week_in_year}, days that appeared {weeks_dates[week_in_year]}')

输出:

Week number 34, days that appeared ['Monday', 'Monday', 'Tuesday']
Week number 35, days that appeared ['Friday', 'Monday', 'Thursday']