2013-08-25 21 views
5

Jestem programistą programiści i muszę napisać skrypt, aby sprawdzić, czy podana data (przekazana jako ciąg w postaci "Miesiąc, rok") jest trzecim piątkiem miesiąc. Używam Pythona 2.7.Python: trzeci piątek miesiąca

Na przykład te daty mogą pomóc lepiej zrozumieć mój problem. Mieć pod ręką roczny kalendarz.

  • wejście ---> wyjście
  • '18 stycznia 2013' ---> true
  • '22 lutego 2013' ---> Fałszywe
  • „21 czerwca 2013 '---> true
  • '20 września 2013' ---> true

chcę po prostu używać standardowych klas przedstawionych przez język, takich jak czas, datetime, kalendarza itp

Przejrzałem kilka odpowiedzi, ale widzę obliczenia takie jak addidng/odejmowanie 86400 sekund na każdy dzień lub nawet porównywanie w zależności od liczby dni w miesiącu. IMHO są złe, ponieważ libreries w Pythonie już zajmują się tymi szczegółami, więc nie trzeba wymyślać koła. Również kalendarze i daty są złożone: lata przestępne, sekundy przestępne, strefy czasowe, numery tygodniowe itp., Więc uważam, że lepiej byłoby, gdyby biblioteki rozwiązały te trudne szczegóły.

Z góry dziękuję za pomoc.

+0

Czy dzień wprowadzenia zawsze jest piątek? –

+0

wejście jest losowe i chce sprawdzić, czy dzień wejściowy jest trzeci piątek miesiąca – Hardy

+0

Czy Twoje dane wejściowe mają zawsze postać "Mmm dd, YYYY"? Jeśli tak, jak można podzielić ten ciąg, aby miesiąc, dzień i rok zostały podzielone na osobne zmienne? W jaki sposób przekażesz je do biblioteki, aby uzyskać obiekt zawierający informacje takie jak dzień tygodnia? – chrylis

Odpowiedz

15

ten powinien zrobić:

from datetime import datetime 

def is_third_friday(s): 
    d = datetime.strptime(s, '%b %d, %Y') 
    return d.weekday() == 4 and 14 < d.day < 22 

Test:

print is_third_friday('Jan 18, 2013') # True 
print is_third_friday('Feb 22, 2013') # False 
print is_third_friday('Jun 21, 2013') # True 
print is_third_friday('Sep 20, 2013') # True 
+0

dziękuję bardzo za pomoc. Naprawdę sprytna i krótka odpowiedź. Nie zdawałem sobie z tego sprawy, a moje rozwiązanie było bardziej skomplikowane !! –

+1

Czy możesz wyjaśnić, w jaki sposób wybrałeś daty '14

+3

@MichaelMolter pierwsze 7 dni musi mieć piątek. Więc pierwszy piątek jest gdzieś od 1 do 7, co oznacza (dodając 14) w trzeci piątek jest od 15 do 21. –

2

można użyć coś takiego dostać trzecią fridday miesiąca (Bieżący miesiąc), a następnie po prostu porównać że third_friday z Twój dzień (rok, miesiąc, dzień)

from datetime import datetime, timedelta 
import calendar 

now = datetime.now() 
first_day_of_month = datetime(now.year, now.month, 1) 
first_friday = first_day_of_month + timedelta(days=((4-calendar.monthrange(now.year,now.month)[0])+7)%7) 
# 4 is friday of week 
third_friday = first_friday + timedelta(days=14) 

Mam nadzieję, że to pomoże.

+1

Dzięki za pomoc. Głosuję jednak za rozwiązaniem @elyase. –

1

Jeśli próbujesz znaleźć upływie danego option, można użyć coś jak ten

from datetime import datetime 
import calendar 

def option_expiration(date): 
    day = 21 - (calendar.weekday(date.year, date.month, 1) + 2) % 7 
    return datetime(date.year, date.month, day) 

print option_expiration(datetime.today()) 
2

Jeszcze innym sposobem, aby to osiągnąć stosując podział całkowitą ... ...

import datetime 

def is_date_the_nth_friday_of_month(nth, date=None): 
    #nth is an integer representing the nth weekday of the month 
    #date is a datetime.datetime object, which you can create by doing datetime.datetime(2016,1,11) for January 11th, 2016 

    if not date: 
     #if date is None, then use today as the date 
     date = datetime.datetime.today() 

    if date.weekday() == 4: 
     #if the weekday of date is Friday, then see if it is the nth Friday 
     if (date.day - 1) // 7 == (nth - 1): 
      #We use integer division to determine the nth Friday 
      #if this integer division == 0, then date is the first Friday, 
      # if the integer division is... 
      # 1 == 2nd Friday 
      # 2 == 3rd Friday 
      # 3 == 4th Friday 
      # 4 == 5th Friday 
      return True 

    return False