2013-08-25 10 views
5

Ich bin ein Anfänger Python Programmierer und ich muss ein Skript schreiben, um zu überprüfen, ob ein bestimmtes Datum (als String in der Form 'Monat, Tag Jahr' übergeben) ist der dritte Freitag der Monat. Ich benutze Python 2.7.Python: Dritter Freitag eines Monats

Zum Beispiel können diese Daten Ihnen helfen, mein Problem besser zu verstehen. Halten Sie einen Jahreskalender bereit.

  • Eingang ---> Ausgabe
  • '18. Januar 2013' ---> True
  • '22. Februar 2013' ---> False
  • ‚21. Juni 2013 '---> True
  • '20. September 2013' ---> True

ich mag nur Standardklassen von der Sprache zur Verfügung gestellt verwenden, wie Zeit, Datumzeit, Kalender, usw.

Ich habe mir einige Antworten angesehen, aber ich sehe Berechnungen wie addidng/subtrahieren 86400 Sekunden für jeden Tag oder sogar Vergleiche abhängig von der Anzahl der Tage, die ein Monat hat. IMHO diese sind falsch, weil die Libreries in Python sich schon um diese Details kümmern, also gibt es keine Notwendigkeit, das Rad neu zu erfinden. Auch Kalender und Daten sind komplex: Schaltjahre, Schaltsekunden, Zeitzonen, Wochenzahlen usw. Ich denke, es ist besser, wenn die Bibliotheken diese kniffligen Details lösen.

Vielen Dank im Voraus für Ihre Hilfe.

+0

Ist der Eingangstag immer ein Freitag? –

+0

Eingabe ist zufällig und er möchte überprüfen, ob Eingabe Tag ist dritten Freitag des Monats – Hardy

+0

Ist Ihre Eingabe immer in der Form "Mmm dd, YYYY"? Wenn ja, wie könnten Sie diese Zeichenfolge aufteilen, um Monat, Tag und Jahr in separate Variablen zu setzen? Wie würden Sie sie an die Bibliothek übergeben, um ein Objekt mit Informationen wie dem Wochentag zu bekommen? – chrylis

Antwort

15

Dies sollte es tun:

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

vielen Dank für Ihre Hilfe. Wirklich schlau und kurze Antwort. Ich habe es nicht bemerkt und meine Lösung war komplizierter !! –

+1

Können Sie näher erläutern, wie Sie die Daten für '14

+3

@MichaelMolter die ersten 7 Tage müssen einen Freitag haben. Der erste Freitag ist also zwischen 1 und 7, was bedeutet, dass der dritte Freitag zwischen 15 und 21 liegt. –

2

Sie so etwas wie diese verwenden können dritte fridday des Monats (aktueller Monat) zu bekommen, und dann vergleichen Sie einfach, dass third_friday mit Ihr Tag (nach Jahr, Monat, Tag)

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) 

Hoffe, das hilft.

+1

Danke für Ihre Hilfe. Ich stimme jedoch für @elyase Lösung. –

1

Wenn Sie den Ablauf einer option zu finden sind versuchen, könnten Sie so etwas wie dieses

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

Noch eine andere Art und Weise verwenden, um dies zu erreichen ... mit Integer-Division ...

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 
Verwandte Themen