【问题标题】:Import everyday date for one year导入一年的每日日期
【发布时间】:2019-04-02 20:00:18
【问题描述】:

有没有一种简单的方法可以将包含给定年份的所有日期的列表导入到我的 Python 文件中? 我需要将一年中的每一天(01.01.2018----31.12.2018)存储到一个列表中,这样我就可以将该列表导入到 SQL 数据库中表的列中。

我已经在 Google 上搜索了几个小时,但没有找到任何东西,但应该有办法直接导入它...

有人知道吗?非常感谢!

【问题讨论】:

  • 是的,完全有可能。除了导入标准模块之外,还可以在没有任何外部文件的情况下制作日期范围。这里没有足够的信息来纠正您的方法
  • 使用 datetime 包和一个简单的循环来生成日期:从 1 月 1 日开始并不断添加一天。将每个日期转换为所需的日期格式。将这些连接成一个列表。一旦你很好地理解了datetime 函数,你甚至可以在列表理解中做到这一点。

标签: python mysql database sqlite calendar


【解决方案1】:

这对于他正在寻找的东西来说似乎更干净一些,而且是单线!

import datetime

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

这将导致datelist 成为来自[1, 2, 3, ... 365/366]list

编辑添加 Patrick 的建议并根据需要更正格式

要获得所需格式,您只需从here 解释的数字中获取日期并正确格式化即可。这也可以在一行中完成,但对某些人来说有点多。

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

【讨论】:

    【解决方案2】:

    借助 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;
    

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

      • 由于您的日期格式是 dd-mm-yy,请改用:print(currentDate.strftime('%d.%m.%Y'))
      • 非常感谢!这个适合我的情况
      【解决方案4】:

      您可以从2018-1-1 的日期时间开始,然后添加0364/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)]
      

      闰年:

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

      输出:

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

      【讨论】:

      • 闰年会失败,不是吗?
      • 这不是我的反对意见,应该比较容易解决,但我敢肯定这是错误的。
      • @roganjosh 已修复。 OP 明确要求 2018 年 - 我们在 2018 年没有闰日......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多