导入一年的每日日期
Posted
技术标签:
【中文标题】导入一年的每日日期【英文标题】: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
函数,你甚至可以在列表理解中做到这一点。
Iterating through a range of dates in Python的可能重复
【参考方案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
的日期时间开始,然后添加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)]
闰年:
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 年没有闰日......以上是关于导入一年的每日日期的主要内容,如果未能解决你的问题,请参考以下文章