2017-06-16 1 views
0

Ich kann nicht herausfinden, wie man das Jahr, den Tag und die Woche nimmt, um den Monat zurückzugeben. Im Moment versuche ich nur ein Python-Skript zu entwickeln, das dies tut. Das Ziel nach Abschluss dieses Skripts besteht darin, es für eine Spark SQL-Abfrage zu verwenden, um den Monat zu finden, da ich in meinen Daten einen Tag, ein Jahr und eine Woche in jeder Zeile angegeben habe.Monat von Tag, Woche und Jahr finden Python

Ab sofort sieht mein Python-Code so aus. Dieser Code funktioniert nur für die Anweisung, die ich in den Druck habe (getmonth (2, 30, 2018) gibt 7 zurück. Ich habe andere Daten ausprobiert und die Ausgabe ist nur "None". Ich habe auch Variablen versucht, aber keinen Erfolg.

import datetime 

def month(day, week, year): 
    for month in range(1,13): 
     try: 
      date = datetime.datetime(year, month, day) 
     except ValueError: 
      iso_year, iso_weeknum, iso_weekday = date.isocalendar() 
      if iso_weeknum == week: 
       return date.month 
print(getmonth(2, 30, 2018)) 


#iso_(year,weeknum,weekday) are the classes for ISO. Year is 1-9999, weeknum is 0-52 or 53, and weekday is 0-6 
#isocaldenar is a tuple (year, week#, weekday) 
+1

Sollte es nicht sein 'def getmonth (Tag, Woche, Jahr):' oder 'drucken (Monat (28, 30, 2018))'? Ihr Code gibt 'None' für' print (Monat (28, 30, 2018)) 'ebenfalls zurück. – Deuce

+0

'if' nur erreicht, wenn eine Ausnahme aufgetreten ist, sollten Sie es auf' try' Block verschieben oder es um eine Ebene – mugiseyebrows

+0

@Deuce def getmonth (Tag, Woche, Jahr) auch keine zurück – Travis

Antwort

0

ich Ihre Fragen nicht wirklich verstehen, aber ich denke, Datetime funktioniert ... sorce: Get date from ISO week number in Python.

>>> from datetime import datetime 
>>> day = 28 
>>> week = 30 
>>> year = 2018 
>>> t = datetime.strptime('{}_{}_{}{}'.format(day,week,year,-0), '%d_%W_%Y%w') 
>>> t.strftime('%W') 
'30' 
>>> t.strftime('%m') 
'07' 
>>> 
0

Eine einfachere Lösung kann mit der pendulum Bibliothek erstellt werden, wie in Ihrem Code, Schleife durch Monat Zahlen, erstellen Daten, die Wochen für diese Termine vor dem gewünschten Datum vergleichen wenn halt die Schleife gefunden;.. wenn das Datum wird nicht verlassen dann die Schleife mit, sagen wir, einer -1 gesehen.

>>> import pendulum 
>>> for month in range(1,13): 
...  date = pendulum.create(2018, month, 28) 
...  if date.week_of_year == 30: 
...   break 
... else: 
...  month = -1 
...  
>>> month 
7 
>>> date 
<Pendulum [2018-07-28T00:00:00+00:00]> 
0

Hier ist eine Brute-Force-Methode ist, dass die Tage des Jahres durchläuft (Es erwartet der Tag am Montag 0 sein und Sonntag 6 ist, gibt sie auch den Monat 0 indizierte Januar 0 ist und 11. Dezember ist):

import datetime 

def month(day, week, year): 
    #Generate list of No of days of the month 
    months = [31,28,31,30,31,30,31,31,30,31,30,31] 
    if((year % 4 == 0 and year % 100 != 0) or year % 400 == 0): months[1] += 1 

    #ISO wk1 of the yr is the first wk with a thursday, otherwise it's wk53 of the previous yr 
    currentWeek = 1 if day < 4 else 0 

    #The day that the chosen year started on 
    currentDay = datetime.datetime(year, 1, 1).weekday() 

    #Loop over every day of the year 
    for i in range(sum(months)): 
     #If the week is correct and day is correct you're done 
     if day == currentDay and week == currentWeek: 
      return months.index(next(filter(lambda x: x!=0, months))) 

     #Otherwise, go to next day of wk/next wk of yr 
     currentDay = (currentDay + 1) % 7 
     if currentDay == 0: 
      currentWeek += 1 

     #And decrement counter for current month 
     months[months.index(next(filter(lambda x: x!=0, months)))]-=1 

print(month(2, 30, 2018)) # 6 i.e. July 

months.index(next(filter(lambda x: x!=0, months))) verwendet wird, um den ersten Monat zu bekommen, dass wir nicht verwendet alle Tage von, also der Monat sind Sie zur Zeit in

Verwandte Themen