-6

Is there a simple way to import into my Python file a list with all the dates for a given year? What I need is to store everyday that a year has (01.01.2018----31.12.2018) into a list, so I can then import this list into a column in a table in a SQL database.

I have been Google for hours and didn´t find anything but there should be a way to import this directly...

Anyone knows? Thanks a lot!

petezurich
  • 9,280
  • 9
  • 43
  • 57
Ric
  • 21
  • 1
    Yes, it's completely possible. It's also possible to make the date range without any external file other than importing standard modules. There's not enough info here to correct your approach – roganjosh Oct 29 '18 at 20:13
  • Use the `datetime` package and a simple loop to generate the dates: start on 01 Jan and keep adding a day. Convert each date to the day format you want. Concatenate these into a list. Once you understand the `datetime` functions well, you can even do that in a list comprehension. – Prune Oct 29 '18 at 20:13
  • 1
    Possible duplicate of [Iterating through a range of dates in Python](https://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python) – G. Anderson Oct 29 '18 at 20:14

4 Answers4

2

This seems a bit cleaner for what he's looking for and it's a one-liner!

import datetime

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

This will result in datelist being a list from [1, 2, 3, ... 365/366].

Edit Added Patrick's suggestion and correct formatting as required

All you will need to do to get the format you want would be to get the date from the number explained here and format it correctly. which can also be done in one line but it's a little much for some.

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))]

Broken down, here's the long way of the above:

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"))

This results in a list looking like:

["01.01.2018", "02.01.2018", ... "31.12.2018"]
Jab
  • 26,853
  • 21
  • 75
  • 114
1

With Sqlite, you can do this directly in SQL, no python needed, thanks to recursive CTEs:

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;
Shawn
  • 47,241
  • 3
  • 26
  • 60
-1

You can start with a datetime of 2018-1-1 and add a range of 0 to 364/365 days to that:

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)))

Output:

[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)]
Patrick Artner
  • 50,409
  • 9
  • 43
  • 69
-1
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)
NgoCuong
  • 2,169
  • 1
  • 11
  • 9