2016-11-28 3 views
-1

Я пытаюсь напечатать количество дней в месяце, используя функцию Python calendar.monthrange.Ошибка при использовании переменной в Python calendar.monthrange

У меня есть сценарий, который проходит через cron 1-го числа каждого месяца и должен возвращать количество дней от предыдущего месяца. Я также использую модуль стрелок, чтобы лучше обрабатывать и форматировать любые вызовы по дате/времени, которые я использую во всех своих сценариях.

Поскольку мне нужно найти количество дней в предыдущем месяце, которое возвращается только один день с даты запуска скрипта, я просто вычитаю 1 один через timedelta.

Вот очень сокращенный вариант моего кода, но это рабочая часть:

import calendar 
import arrow 
import time 
from datetime import date, timedelta 

yesterday = date.today() - timedelta(1) 

cYfDate = yesterday.strftime('%Y.%m.%d') 
cYfDateY = arrow.get(cYfDate).format('YYYY') 
cYfDateM = arrow.get(cYfDate).format('M') 

print cYfDateY 
print cYfDateM 

print calendar.monthrange(cYfDateY + ',' + cYfDateM)[1] 

Первые две печатные линии работают отлично и показать правильный год & месяц, но третья печать выдает ошибку:

Traceback (most recent call last): 
    File "/home/pi/SystemChecker.py", line 15, in <module> 
    print calendar.monthrange(cYfDateY + ',' + cYfDateM) 
TypeError: monthrange() takes exactly 2 arguments (1 given) 

Не могу понять, почему это говорит мне, что есть только один аргумент, когда там явно есть два.

+0

Ошибка ясна, вам необходимо пройти 2 арг вместо 1 – ettanany

+0

Разве я не получил, что потом : cYfDateY & cYfDateM? – 1cm69

+1

Просто что-то вроде 'calendar.monthrange (cYfDateY, cYfDateM)' – ettanany

ответ

1

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

calendar.monthrange(cYfDateY, cYfDateM) 

Остальная часть скрипта тоже странная. Вы правильно вычисляете вчерашнюю дату, но затем конвертируете ее в строку, а затем используете стороннюю библиотеку arrow, чтобы получить месяц и день из этой строки. Это даже не будет работать, так как теперь это строки. Зачем ты это делаешь? Почему бы просто не получить месяц и дату, которые у вас уже были?

yesterday = date.today() - timedelta(1) 
cYfDateY = yesterday.year 
cYfDateM = yesterday.month 
+0

Мои извинения, новые для python, все еще учатся. Я использовал модуль стрелок в другом месте и мне удобнее в использовании, но не знал, что есть более быстрый и короткий способ. – 1cm69

+0

Отлично, теперь работаем благодаря. – 1cm69

1

calendar.monthrange() принимает 2 аргумента, year и month. Проверьте документацию здесь для более подробной информации:

calendar.monthrange(year, month)

+0

Большое спасибо за информацию – 1cm69

1

Изменить print calendar.monthrange(cYfDateY + ',' + cYfDateM)[1]
Для `печати calendar.monthrange (cYfDateY, cYfDateM) [1]

+0

Спасибо, я осознал свою тупую ошибку, посмотрев на нее почти час, doh – 1cm69

Смежные вопросы