2016-04-15 3 views
-3

У меня есть куча дат без лет в следующем формате:Рассчитать год от дня недели, месяца и дня

Thu Apr 10 
Mon Mar 28 

Есть простой способ в Python, чтобы определить год эти даты берутся?

+2

Нет, потому что те, ДАТЫ могут совпадать * много разных лет *, например. 28 марта - понедельник каждые несколько лет. –

ответ

1

Конечно, будут случаи, когда действует более одного года, но при условии, что вы хотите принять более поздний год, если есть такой случай, тогда этот алгоритм должен работать нормально.

For each string 
    Take the Month(Apr) and the Date(10) 
    For each year from this year down to whenever you'd like to stop 
     Make a datetime object with the Month, Date, and Year 
     If the datetime object's .weekday is the same as the Day you have (Thu) 
      You've found the right year 

Или питона, это может выглядеть примерно так:

import datetime 

with open("yourFile") as f: 
for line in f: 

    day = #get the day from the line (0-30) 
    month = #get the number representing the month from the line (0-11) 

    year = 2016 
    while True: 
     testDate = datetime.date(year, month, day) 
     weekday = #turn the string "Thu" or "Mon" into the number value 
        #it represents (0-6) 
     if testDate.weekday == weekday: 
      #You have found a matching year!!! 
     else: 
      year = year + 1 
+0

@MattDMo Я не был готов вставить код python, когда вы это прокомментировали. Теперь вы можете увидеть код python. Но независимо, psuedo-код может быть очень полезным. Почему вы думаете, что это бесполезно? –

+0

@MatthewCliatt Спасибо. Я надеялся, что есть встроенная функция datatime, которая может это сделать, однако ваш подход с использованием bruteforce - это то, что я буду использовать. – steve

+0

У вас должна быть довольно тонкая кожа. Вы знаете, не знаете ли вы, что серийное затворничество поймано и отменено каждую ночь? Оставляя неразумный комментарий к нисходящим сообщениям, вы не можете скрыть свою личность. Я бы посоветовал вам сбить его, прежде чем произойдет что-то плохое. Я проигнорировал ваш пост, потому что вы пытались быть FGITW, но вы не сделали даже немного положительного вклада - просто какой-то бессвязный не-псевдокод, который никому не помог бы, особенно OP, который попросил о помощи в Python. Все в порядке, чтобы сначала дать код, затем расширить его, * если * код решает проблему. Твой не сделал. – MattDMo

0

ниже код должен работать, вы должны будете выбрать год, чтобы начать с и направление идти как step (-1 для спины во время, 1 на вперед во время), и это даст вам первый год он встречает, для которых условие истинно:

import datetime 
weekdays = {'Mon': 0, 'Tue': 1, 'Wed': 2, 'Thu': 3, 'Fri': 4, 'Sat': 5, 'Sun': 6} 
months = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 
      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12} 
dates = ['Thu Apr 10', 'Mon Mar 28'] 
startYear = 2016 
step = -1 
years = [] 

for date in dates: 
    [weekDay, month, day] = date.split(' ') 
    day = int(day) 
    year = startYear 
    while True: 
    if datetime.date(year, months[month], day).weekday() == weekdays[weekDay]: 
     years.append(year) 
     break; 
    else: 
     year = year + step