python实现以立春为起点n为周期任意日期所在的日期区间

需求

话不多说,直接上具体需求。

'''以每年的立春作为起始点,每N天为一个单元,任给一个日期,返回该日期所在单元的起始和结束日期。例如:N=3, 输入日期20180208,返回20180207,20180209(2018年的立春是20180204,所以第一个单元是20180204-20180206,第二个单元是 20180207-20180209,依次类推)'''

分析

上边的需求乍一看还挺简单,但是具体实现起来还是需要对time模块、datatime模块、sxtwl模块的熟练应用。

首先呢,要求以立春为起始点,那么说我们可以找出立春在一年中的第num_day_0天,同时我们也找出我们输入的日期在一年中的第num_day_x天。这样一来,我们就可以计算出这两天相差的天数day_diff,使用day_diff除以周期N,就可以确定我们输入的日期是在周期日期区间的边线还是在日期区间的中间。然后我们就可以根据输入日期在一年中的第num_day_x以及相差的天数day_diff来计算出需要的日期区间,最麻烦的就在于根据num_day求日期了。

其中的难点我认为有两点,一是根据输入的年份来确定立春的阳历日期,二就是计算日期区间了。当然了,这些对大神来说都是so easy!下来我们看代码。

实现

立春日期

立春日期的确定,我费了不少劲,网上各种查找,偶然间看到了sxtwl模块,于是找到了它的官方文档,参考官方文档中的演示代码,写下了下边的代码,其实这个模块我也没看得很明白,也没怎么看,就发现我使用jqmc方法可以确定立春日期。

这里解释下,我多次实验发现,当day.jqmc的值为3时,这天就为立春,其他日期返回值为0。附上官方文档的部分资料:

'''jqmc = ["冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑","白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪"]'''

看完这个列表你就能发现,立春的索引为3,于是就这样含糊的写出了计算立春的代码。

importsxtwldefgetTerms(year, month, day):

lunar= sxtwl.Lunar() #实例化日历库

day =lunar.getDayBySolar(year, month, day)return day.jqmc #0为非春分;3为春分

num_day转日期

接下来就是这个计算在一年中第多少天的问题,其实这个问题并不难,因为我之前就是知道使用time模块就可以查得到。但是问题是在于知道一年中的第多少天了,怎么得出这一天在一年中的阳历日期呢。下面的代码我也是在网上找了别人的代码参考的。

importdatetimedefout_date(year, day):

fir_day= datetime.datetime(year, 1, 1) # 每年的第一天

zone= datetime.timedelta(days=day - 1) # 日期差值day_diffreturn datetime.datetime.strftime(fir_day + zone, "%Y-%m-%d") # 得到日期

主代码

importtimefrom spring_begins importgetTermsfrom num_day importout_datedefinput_time(n, inp_time):

# 构造两个年份字典,用来判断输入时间的合法性

common_year= {'01': 31, '02': 28, '03': 31, '04': 30, '05': 31, '06': 30, '07': 31, '08': 31, '09': 30,'10': 31, '11': 30, '12': 31}

leap_year= {'01': 31, '02': 29, '03': 31, '04': 30, '05': 31, '06': 30, '07': 31, '08': 31, '09': 30,'10': 31, '11': 30, '12': 31}

# 判断输入的日期是不是纯数字组成的if notinp_time.isdigit():return print('输入的内容有误(不是纯数字)!!!')

# 判断输入日期的长度if len(inp_time) != 8:return print('输入的内容有误(长度有误)!!!')

# 判断输入的月份是否在正确范围内if month_judge(inp_time[4:6]):pass

else:return print('月份输入有误!!!')

# 判断平年闰年if common_or_leap(int(inp_time[:4])):

day_judge(inp_time[-2:], inp_time[4:6], leap_year)

# 判断n输入的合法性,n最大等于一年的总天数if int(n) > 366:return print('N输入超范围!!!')else:

day_judge(inp_time[-2:], inp_time[4:6], common_year)if int(n) > 365:return print('N输入超范围!!!')

# 通过查资料得出立春在每年的二月的三号到八号之间,所以遍历这六天来确定最终的日期for i in [3, 4, 5, 6, 7, 8]:if getTerms(int(inp_time[:4]), 2, i) == 3:

spring_b= f'{inp_time[:4]}020{i}' #得到立春日期

# 立春的格式化时间,后续取一年中的第num_day用

struct_time_S= time.strptime(f'{spring_b[:4]}-{spring_b[4:6]}-{spring_b[-2:]}', '%Y-%m-%d')

# 输入日期的格式化时间

struct_time= time.strptime(f'{inp_time[:4]}-{inp_time[4:6]}-{inp_time[-2:]}', '%Y-%m-%d')

# 输入日期与立春的天数差day_diff

yushu= (struct_time.tm_yday - struct_time_S.tm_yday) %int(n)

# 输出结果print((out_date(int(inp_time[:4]), struct_time.tm_yday -yushu),

out_date(int(inp_time[:4]), struct_time.tm_yday - 1 - yushu +int(n))))defcommon_or_leap(years):

'''

判断日期的平闰年

'''if years % 4 == 0 & years % 100 != 0 or years % 400 ==0:returnTruedefmonth_judge(months):

'''

判断日期中月份的合法性

'''if int(months) <= 12:returnTruedefday_judge(days, months, year_kind):

'''

判断日期中日的合法性

'''if int(days) <=year_kind[months]:returnTrueif __name__ == '__main__':

n= input('请输入周期N>>>').strip()

inp_time= input('请输入日期(格式20160920)>>>').strip()

input_time(n, inp_time)

以上就是我写这个需求是遇到的问题以及最终的结果,其中可能存在小的问题,本代码仅供参考。

python时间和周期_python实现以立春为起点n为周期任意日期所在的日期区间相关推荐

  1. python时间模块倒计时_Python时间模块

    python时间模块倒计时 In this tutorial, we will learn about the Python time module. Python Variable is discu ...

  2. python时间序列分析包_python关于时间序列的分析

    1, pandas生成时间一般采用date_range操作,这个之前的博客已经详细的讲解过,这里就不在阐述 2, pandas的数据重采样 什么是数据重采样? 就好比原来一堆统计数据是按照天来进行统计 ...

  3. python 时间格式 工作日_python使用time、datetime返回工作日列表实例代码

    最近在学习python,动手做了一个自动填写日报的小工具:由于请求中包含时间,格式如:2016-08-04:所以就了解了一下python的时间日期相关函数:这里做简单记录. 函数功能非常简单:获取当月 ...

  4. python时间格式化代码_Python datetime格式化代码

    1.datetime格式化代码 1)datetime模块中包含如下类:类名功能说明date日期对象,常用的属性有year, month, day time时间对象 datetime日期时间对象,常用的 ...

  5. python时间格式化代码_Python代码中如何将”日期时间”格式化为自己所需的样式呢?...

    摘要: 下文讲述Python代码中将日期时间格式化为时间的方法分享,如下所示: 实现思路: 使用time.strftime函数将 一个时间元组格式化自定义的模式 strftime函数语法: time. ...

  6. python时间相减_python处理时间加减

    最近用python做pv和uv数据统计分析时,原始日志文件中用户访问的时间不对, 需要往后延8小时,记录一下:>>> import datetime >>> pag ...

  7. python时间相减_python 计算时间差,时间加减运算代码

    1.方便的计算两个时间的差,如两个时间相差几天,几小时:import datetime d1 = datetime.datetime(2009, 3, 23) d2 = datetime.dateti ...

  8. python时间模块设置_Python之时间和日期模块

    1.import time 先要导入时间模块 1)time.time()得到当前的时间,返回的是时间戳,表示自1970年1月1日起到程序运行时的秒数 1 importtime2 print(time. ...

  9. python 单位根检验代码_python时间序列分析

    什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值.在这里需要强调一点的是,时间序列分析并不是关于时间的回归,它主要是研究自身的变化规律的(这里 ...

  10. python时间函数纳秒_python 时间 纳秒_Pandas时间序列(翻译)

    昨天快下班时的需求,对时间进行偏移计算.找了一篇介绍Pandas时间序列的文章,大致翻译一下(把英文粘贴到谷歌翻译,再把中文拷贝过来). 原文:https://jakevdp.github.io/Py ...

最新文章

  1. matlab contour光滑,使用Matplotlib在Contour Plot中平滑数据
  2. 腾讯优图开源业界首个3D医疗影像大数据预训练模型
  3. (How to)WordPress与Windows Live Writer整合
  4. xctf php2,XCTF PHP2
  5. 信息系统项目管理师:论项目的质量管理
  6. 页面的div中有滚动条,js实现刷新页面后回到记录时滚动条的位置
  7. Linux 命令之 stat -- 显示文件的状态信息
  8. 第六十九期: 漫画说算法之什么是一致性哈希?
  9. SpringBoot搭建天气预报微服务系统
  10. 要成为linux网站运维工程师必须要掌握的技能
  11. python表白代码-python浪漫表白源码
  12. 如何高效学习web_使用高效的Web工具改善您的业务
  13. 编译内核报错——*** 没有规则可制作目标“debian/canonical-revoked-certs.pem”,由“certs/x509_revocation_list” 需求。 停止。
  14. 【C++项目】boost搜索引擎项目
  15. excel图片技巧:如何为报表配上节日祝福动画
  16. 小程序中打开pdf文件(wx.downloadFile+wx.openDocument)
  17. 微信小程序进阶学习笔记Day05
  18. ξσ Dicky's GuestBook σξ
  19. Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)
  20. 知识付费项目有哪些?

热门文章

  1. 三星android 截图,三星手机如何截图?几种三星手机截屏的方法教程
  2. K210基础实验—获取,修改像素值
  3. 解决 IIS 部署网站引用 woff/woff2/svg 字体报 404 错误
  4. JS正则表达式--正则量词与元字符
  5. 为什么程序员大多数都会脱发?( ConcurrentHashMap 并发)
  6. c语言实现 三角函数,关于数学:快速实现C ++三角函数
  7. 什么是动态域名解析?---金万维
  8. vc2005和IE冲突 主要是在通过向导添加方法或变量的时候会报脚本错误。
  9. vue 使用 vue-awesome-swiper(swiper)解决方法
  10. 魏吉英:IPONE5越狱