Попытка вставить целое число из списка в объект datetime - PullRequest
2 голосов
/ 28 февраля 2010

То, что я пытаюсь выполнить, очень просто: создать цикл из диапазона (довольно понятный ниже), который вставит месяц в объект datetime. Я знаю, что% d требует целое число, и я знаю, что тип 'month' имеет тип int ... поэтому я застрял в том, почему не могу заменить свою переменную месяца. Вот мой код:

all_months=range(1,13)
for month in all_months:
    month_start = (datetime.date(2010,'%d',1))%month
    next_month_begin= datetime.date(2010,'%d',1)%(month+1)  
    month_end=next_month_begin - timedelta(days=1)
    print month_start                                        
    print month_end

Что я делаю не так?

Вся помощь приветствуется! Спасибо

Ответы [ 4 ]

2 голосов
/ 28 февраля 2010

Здесь есть несколько вещей, которые вам нужно исправить.

РЕДАКТИРОВАТЬ: Во-первых, будьте осторожны с вашим диапазоном, так как вы используете месяц + 1 для создания next_month_begin, вы не хотите, чтобы это было больше 12, или вы получите ошибку.

Далее, когда вы пытаетесь создать объект даты, вы передаете месяц в виде строки при использовании (datetime.date(2010,'%d',1))%month. Ваш код, вероятно, выдает эту ошибку TypeError: an integer is required.

Вам нужно дать ему целое число, представляющее месяц, а не строку целого числа (есть разница между 1 и '1'). Это также простое исправление, поскольку у вас есть переменная с именем month, которая уже является целым числом, просто используйте ее вместо создания строки. Итак, ваш код должен выглядеть примерно так:

month_start = datetime.date(2010,month,1)

Я думаю, вы можете понять, как применить это к вашему next_month_begin заданию.

Последняя проблема заключается в том, что вам нужно использовать datetime.timedelta, чтобы сообщить Python, что нужно искать в модуле datetime функцию timedelta() - ваша программа в настоящее время выдаст ошибку, сообщающую, что timedelta не определена. 1023 *

Дайте мне знать, если у вас возникли проблемы с применением этих исправлений. Обязательно укажите, какую ошибку вы можете получить.

2 голосов
/ 28 февраля 2010

У вас есть другие ответы, но вот способ узнать последний день месяца. Добавление 31 дня приведет вас к следующему месяцу независимо от количества дней в текущем месяце, а затем возврат к первому и вычитание дня даст дату окончания.

import datetime
for month in range(1,13):
    month_start = datetime.date(2010,month,1)
    into_next_month = month_start + datetime.timedelta(days=31)
    month_end = into_next_month.replace(day=1) - datetime.timedelta(days=1)
    print month_start,month_end                                       
0 голосов
/ 28 февраля 2010

Проверьте модуль календаря (http://docs.python.org/library/calendar.html).

В него включены батареи для такого рода вещей ...

Вы можете просто сделать:

from calendar import Calendar
def start_and_end_days(year, month):
    cal = Calendar()
    month_days = [day for day in cal.itermonthdays(year, month) if day.month == month]
    first_day = month_days[0]
    last_day = month_days[-1]
    return (first_day, last_day)
0 голосов
/ 28 февраля 2010

month - это переменная, и вы можете использовать ее для создания объекта datetime. Я думаю, что вы хотите сделать следующее:

month_start = datetime.date(2010, month, 1)
next_month_begin = datetime.date(2010, month+1, 1)

Это сработает, потому что datetime.date () требует 3 целочисленных аргумента. '%d' % month вместо этого отформатирует целое число month как строку. '%04d' % 3 например, отформатирует число 3 с 4 цифрами и начальными нулями. Но важно знать, что даже (почти неформатированная) строка "3" отличается от числа 3 в Python.

И вы не можете написать datetime(...) % 3, потому что оператор % будет работать только при использовании в строке формата, как в предыдущем примере "%03d" % 3, а не в объекте datetime.

Но другие типы также могут принимать оператор % (не включая объекты даты и времени). Например, целые числа принимают оператор %, чтобы получить остаток от деления: 3 % 2 # returns 1. Но там значение % совершенно иное, поскольку значение оператора зависит от задействованных типов. Например, попробуйте 3 + 2 и "3" + "2". Там значение + отличается (сложение целых и конкатенация строк), потому что типы тоже разные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...