Импорт ежедневной даты на один год - PullRequest
0 голосов
/ 29 октября 2018

Есть ли простой способ импортировать в мой файл Python список всех дат за данный год? Что мне нужно, это хранить каждый день, который имеет год (01.01.2018 ---- 31.12.2018) в списке, чтобы затем я мог импортировать этот список в столбец таблицы в базе данных SQL.

Я часами был в Google и ничего не нашел, но должен быть способ импортировать это напрямую ...

Кто-нибудь знает? Большое спасибо!

Ответы [ 4 ]

0 голосов
/ 30 октября 2018

С помощью Sqlite вы можете делать это напрямую в SQL, без использования Python, благодаря рекурсивным CTE:

CREATE TABLE days(day TEXT PRIMARY KEY) WITHOUT ROWID;
INSERT INTO days(day)
  WITH RECURSIVE alldays(day) AS
       (VALUES ('2018-01-01')
        UNION ALL
        SELECT date(day, '+1 day')
        FROM alldays
        LIMIT 366 -- Take leap years into account
       )
  SELECT day FROM alldays WHERE day <= '2018-12-31';
-- List days in October:
SELECT day FROM days WHERE day BETWEEN '2018-10-01' AND '2018-10-31' ORDER BY day;
0 голосов
/ 29 октября 2018
from datetime import date
from datetime import timedelta

#get starting date 01.01.2018
startingDate = date(date.today().year, 1, 1)
currentDate = startingDate
for _ in range(365):
    print(currentDate.strftime('%m.%d.%Y'))
    #get next day
    currentDate = currentDate + timedelta(days=1)
0 голосов
/ 29 октября 2018

Это кажется немного чище для того, что он ищет, и это однострочник!

import datetime

year = 2018
datelist = [d for d in range(datetime.date(year,12,31)-datetime.date(year,1,1)).days)]

В результате datelist будет list из [1, 2, 3, ... 365/366].

Редактировать Добавлено предложение Патрика и правильное форматирование при необходимости

Все, что вам нужно будет сделать, чтобы получить нужный формат, это получить дату из числа, объясненного здесь , и правильно отформатировать его. что также можно сделать в одну строку, но для некоторых это немного.

datelist = [datetime.fromordinal(date(year, 1, 1).toordinal() + d - 1).strftime("dd.mm.yyyy") for d in range(1,365+ 1 if isLeap(year) else 0))]

Сломан, вот длинный путь вышеупомянутого:

datelist = []
for d in range(1,365+ 1 if isLeap(year) else 0):
    day = datetime.fromordinal(date(year, 1, 1).toordinal() + d - 1)
    datelist.append(day.strftime("dd.mm.yyyy"))

В результате получается список, похожий на:

["01.01.2018", "02.01.2018", ... "31.12.2018"]
0 голосов
/ 29 октября 2018

Вы можете начать с даты и времени 2018-1-1 и добавить к этому диапазон от 0 до 364/365 дней:

import datetime

def getDays(year):
    """Generates all days in one year, respecting leap years. Uses Gregorian
    calendarso best keep the year post 1582."""
    def isLeap(y):
        return y%4 == 0 and ( not y % 100 == 0 or y % 400 == 0)

    dt = datetime.date(year,1,1)
    days = 365 + (1 if isLeap(dt.year) else 0) # needs the (..) due to operator precedence

    return (dt + datetime.timedelta(days=k) for k in range( days ) ) 

print(list(getDays(2018)))

Выход:

[datetime.date(2018, 1, 1), datetime.date(2018, 1, 2), datetime.date(2018, 1, 3), ..., 
 datetime.date(2018, 12, 29), datetime.date(2018, 12, 30), datetime.date(2018, 12, 31)]

Leapyears:

for y in [1900,2000]:
    d = list(getDays(y))
    print(d[58:60], d[-1:])

Ouput:

# 1900 - not a leap yeaer
[datetime.date(1900, 2, 28), datetime.date(1900, 3, 1)] [datetime.date(1900, 12, 31)]

# 2000 - a leap year
[datetime.date(2000, 2, 28), datetime.date(2000, 2, 29)] [datetime.date(2000, 12, 31)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...