Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >从数字串中解释日期

从数字串中解释日期
EN

Code Review用户
提问于 2019-10-08 01:08:46
回答 1查看 266关注 0票数 7

我开发了一个函数,从给定的数字序列中提取日期并重新格式化它。

这是代码:

代码语言:javascript
代码运行次数:0
复制
from datetime import datetime as dt


def format_dates(field):
    n = len(field)
    match = False
    i = 0
    while match is False:
        try:
            # Take the last four digits
            year = int(field[-4 - i:n - i])
        except ValueError:
            return ''

        # Check if this year is between today's year +/- (15, 100)
        if (1919 <= year <= 2019):
            # Check if there are other 4 digits before these 4 ones
            if (len(field[-8 - i:n - i]) == 8):
                try:
                    f_date = dt.strptime(field[-8 - i:n - i],
                                         '%d%m%Y').strftime('%d/%m/%Y')
                    match = True
                    return f_date
                except ValueError:
                    pass
            else:
                return ''
        i += 1

解释:

这一职能:

  • 接受一个数字序列作为输入。
  • 从这个序列中提取最后四个数字。
  • 检查提取的四位数是否在2019年至1919年之间,如果没有,则会中断。
  • 如果是,它会检查在先前提取的数字之前是否还有4位数字,如果没有,则会中断。
  • 如果是,则尝试格式化整个8位数字。
  • 如果有ValueError异常,它就会通过(ValueError,表示有8位数字,最后4位代表一个正确的年份,但前四位数字是错的。因此,它传递到增量i+1,以添加前面的下一个数字,并删除处理序列中的最后一个数字)。

示例:

输入:‘1303201949’

  1. 迭代1:
    • I= 0,match = False
    • 年份=1946年
    • 测试1(2019年至1919年之间的年份):及格。
    • test2 (1946年之前还有4位数字,即0320位):passes。
    • 格式化整个8位数: ValueError异常,因此i= i+1并传递到下一次迭代。

  2. 迭代2:
    • I= 1,match = False
    • 年份= 0194
    • 测试1( 2019至1919年之间的年份):失败,因此i=i+1并传递到下一次迭代。

  3. 迭代3:
    • I= 2,match = False
    • 年份=2019年
    • 测试1:通过
    • 测试2:通过
    • 格式化全部8位数字(13032019):13/03/2019年(无ValueError异常)通过
    • match = True,返回格式化日期,从while循环中中断。

这个函数工作得很好,但是它处理错误的方式看起来很难看。另外,我认为它不是优化的(同样的例外是重复的,很多返回和代码似乎不优雅)。

如何重新格式化代码并使其更加优化?

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-10-08 02:36:14

异常

如果算法找不到日期,则引发异常比返回''更容易。如果此函数的用户不测试该哨兵值,则返回前哨值而不是异常会导致意外行为。

注释

评论应该解释你为什么做某事,而不是怎么做。# Take the last four digits只告诉您代码本身。我宁愿在field[-4 - i:n - i]上评论为什么您做n - i而不是只做-i

嵌套

与其嵌套许多if-子句,不如测试条件和continue的负值,这样代码的其余部分就更少嵌套了。

匹配

不要测试condition is True。只要做condition。在Python中,许多值可以在测试中充当TrueFalse

无论如何,您的match从未被使用过;当您将其设置为True时,您还将返回结果,因此while True:在这里就足够了。

field

这是一个非常不清楚的变量名。此方法不包含字符串格式的日期,那么为什么不这样调用参数呢?

返回类型

你的代码现在做了两件事。它在字符串中查找日期,并将该日期转换为其他格式。最好将这两件事分开,然后返回一个datetime.datetime,让这个方法的调用者担心如何正确格式化。

while True

您使用的是带有递增计数器的while True-loop。更好的方法是使用for i in range(...)或使用itertools.countfor i in itertools.count()。在这种情况下,您知道只会有len(field) - 7迭代,所以您最好使用它。

还原算法

您将显式测试子字符串是否有8个字符长,然后测试其格式是否正确。通过将while True更改为for-loop,您知道子字符串将有8个字符长。然后,首先尝试将其转换为datetime,然后检查年份是否正确,这是有意义的:

代码语言:javascript
代码运行次数:0
复制
def format_dates2(date_string):
    n = len(date_string)
    for i in range(n - 7):
        sub_string = date_string[-(8 + i) : n - i]
        # not just -i because that fails at i==0
        try:
            date = dt.strptime(sub_string, "%d%m%Y")
        except ValueError:
            continue
        if not (1919 <= date.year <= 2019):
            continue
        return date
    raise ValueError("Date not in the correct format")
票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/230365

复制
相关文章
C# 如何在Excel 动态生成PivotTable
Excel 中的透视表对于数据分析来说,非常的方便,而且很多业务人员对于Excel的操作也是非常熟悉的,因此用Excel作为分析数据的界面,不失为一种很好的选择。那么如何用C#从数据库中抓取数据,并在
牛嗷嗷
2018/03/30
1.1K0
如何使用Java创建数据透视表并导出为PDF
数据透视分析是一种强大的工具,可以帮助我们从大量数据中提取有用信息并进行深入分析。而在Java开发中,可以借助PivotTable,通过数据透视分析揭示数据中的隐藏模式和趋势。本文将介绍如何使用Java来构建PivotTable以及实现数据透视分析,并将其导出为PDF。
葡萄城控件
2023/10/16
2630
基于纯前端类Excel表格控件实现在线损益表应用
财务报表也称对外会计报表,是会计主体对外提供的反映企业或预算单位一定时期资金、利润状况的会计报表,由资产负债表、损益表、现金流量表或财务状况变动表、附表和附注构成。财务报表是财务报告的主要部分,不包括董事报告、管理分析及财务情况说明书等列入财务报告或年度报告的资料。
葡萄城控件
2022/10/28
3.1K0
搭载AI之后的表格插件又有哪些新的改变
摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
葡萄城控件
2023/10/14
2030
我可以在不source脚本的情况下将变量从Bash脚本导出到环境中吗
有没有一种方法可以通过只执行 export.bash 而不 source 它获取 $VAR?
程序熵
2023/09/25
1800
我可以在不source脚本的情况下将变量从Bash脚本导出到环境中吗
Java在Excel中进行数据分析
前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些APP好像都喜欢出这种记录使用者的支付、消费情况的功能。不过这个显示消费记录的功能的确让人觉得方便很多。这样大家就可以随时随地的查看以前的消费记录,有时候需要查账,翻一翻手机就能看见钱都去哪里了,而且每一笔钱的流向都可以看得非常清楚。既然这个东西这么好用,那可不可以我也搞一个类似的分析工具,这样就可以用它来记录生活中的点点滴滴。由于本人的工作性质,对Excel比较熟悉,首先想到的就是可不可以用一个表格可视化工具来实现这个功能。
葡萄城控件
2023/10/14
2510
Java在Excel中进行数据分析
精读《Excel JS API》
Excel 现在可利用 js 根据单元格数据生成图表、表格,或通过 js 拓展自定义函数拓展内置 Excel 表达式。
黄子毅
2022/03/15
2.9K0
CTO不写代码,真的可以吗?
导读:CTO 在公司里是干嘛的?到底写不写代码?该不该做代码评审(Code Review),亲力亲为给程序员做出榜样?还是把握一下大方向,设计架构,管管程序员,提供一些培训?
IT阅读排行榜
2018/10/25
1.5K0
CTO不写代码,真的可以吗?
Excel 技巧篇-选择性粘贴,只粘贴数值,不粘贴公式
最开始是这样的,我有一行数据,要每一个都除以1000,单位就是k,我想一个一个改就太麻烦了,想到了公式和宏编程,宏编程很强大,但是比较麻烦,于是就用公式了。
小蓝枣
2020/09/23
1.5K0
选择性粘贴:粘贴公式,值,转置
我们都知道CTRL C, CTRL V 但是我们有时候并不是要完全的粘贴 我们可能只是要粘贴这个值,去掉公式 或者只是要粘贴这个格式 或者是要横竖转换 这时候你要用到选择性粘贴 首先 还是先告诉你们
但老师
2022/03/22
2.6K0
选择性粘贴:粘贴公式,值,转置
数据透视表上线!如何在纯前端实现这个强大的数据分析功能?
在Office三大办公套件中,Excel可能是功能最多、最难精通的那一款了。从日常的表格录入到复杂的业务数据统计分析,Excel仿佛一位外表平平无奇,实力却深不可测的武林高手。熟练使用Excel往往能在日常工作中获得事半功倍的效果,而这里所谓的“熟练”除了熟悉大量公式、图表绘制等操作外,还要掌握一项非常重要的特性——数据透视表。 所谓数据透视表,就是将原始的明细数据表中涉及的各组关联数据进行分类汇总的产物。用户可以按照不同的组合方式对原始数据进行处理。例如下面这样的销售业绩原始数据:
葡萄城控件
2022/09/23
2K0
使用Excel切片器切换图表
如下图1所示,根据切片器中的选择来显示图表。它通过工作表change事件运行,在堆积柱形图和簇状柱形图之间切换。其技巧是创建两个图表,一个用于每个区域中的一个,另一个用于总计或所有区域。这样,可以在区域和总计之间切换。
fanjy
2022/11/16
1K0
使用Excel切片器切换图表
手把手教你用Pandas透视表处理数据(附学习资料)
来源:伯乐在线 - PyPer 本文共2203字,建议阅读5分钟。 本文重点解释pandas中的函数pivot_table,并教大家如何使用它来进行数据分析。 介绍 也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为pivot_table。虽然pivot_table非常有用,但是我发现为了格式化输出我所需要的内容,经常需要记住它的使用语法。所以,本文将重点解释pandas中的函数pivot_table,并教大家如何使用它来进行数据分析。 如果你对这个概念
数据派THU
2018/01/29
3.2K0
手把手教你用Pandas透视表处理数据(附学习资料)
在没有外链情况下,如何提高PR值?
外链是提高PR值的有利方式,但现在外链建设愈发困难,各家都对自己的网站进行链接屏蔽,即使你的外链建设成功,在代码状态下依然是Nofollow状态,所以seoer对外链格外关注。
蝙蝠侠IT
2021/03/22
5390
在没有外链情况下,如何提高PR值?
前端html源码可以不暴露接口吗?为什么?
html属于的前端编程中一项,接口是必须要暴露的,起码基于现在的技术框架是无法避免的,因为只要是有关html的代码只需要在浏览器里面右键点击查看源代码所有的相关的html代码都会原封不动的展示出来,所以前端页面的很多样式特效只要有一家有新的变化出来,紧接着很快就会被抄袭拷贝了,样式和风格太容易拿来使用了,所以想在加密只能在数据接口上做做文章,现在web安全已经成为一个非常热点的问题,因为随着网页应用的普及化网页安全将会越来被重视。
程序员互动联盟
2019/03/07
3.2K0
前端html源码可以不暴露接口吗?为什么?
Excel VBA操作切片器切换显示不同的图表
在《使用Excel切片器切换图表》中,我们看到可以根据切片器中的选择来显示图表,但只是给出了简略的介绍。这段时间抽空研究了一下,给出制作过程。
fanjy
2022/11/16
2.3K0
Excel VBA操作切片器切换显示不同的图表
java深拷贝的实现方式_接口可以创建对象吗
Cloneable接口与Serializable接口都是定义接口而没有任何的方法。Cloneable可以实现对象的克隆复制,Serializable主要是对象序列化的接口定义。很多时候我们涉及到对象的复制,我们不可能都去使用setter去实现,这样编写代码的效率太低。JDK提供的Cloneable接口正是为了解决对象复制的问题而存在。Cloneable结合Serializable接口可以实现JVM对象的深度复制。
全栈程序员站长
2022/11/04
1.5K0
AI原来还可以在无监督的情况下进行双语翻译?
该文章介绍了两种在不需要平行文本的情况下进行神经机器翻译的方法。第一种方法是使用无监督学习,通过创建双语词典来实现。第二种方法是使用去噪自回归,在翻译过程中插入噪声,然后反向翻译以消除噪声。这些方法可以提高翻译的准确性,并且可以用于跨语言匹配任务。"
人工智能的秘密
2017/12/27
6860
AI原来还可以在无监督的情况下进行双语翻译?
点击加载更多

相似问题

如何剪切和粘贴PivotTable?

13

创建PivotTable时出错

11

在PivotTable中复制VBA值

10

Excel PivotTable更新-不创建PivotCache (VBA)

20

在PivotTable中显示%

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文