【问题标题】:Split and Format Date Range拆分和格式化日期范围
【发布时间】:2020-05-26 20:56:08
【问题描述】:

我正在从 zapier 中的电子邮件中解析日期范围。内容如下: 2020 年 12 月 4 日 - 1 月 4 日 由此,我需要将开始日期和结束日期分开为 12/04/2019 和 01/04/2020 之类的日期,因为有些日期将在之前开始年份如上面的示例,有些将在同一年,例如 2020 年 3 月 4 日至 3 月 22 日。在 zapier 中使用的代码似乎是 python。我看过熊猫的例子

    import pandas as pd
    date_series = pd.date_range(start='Mar 4' -, end='Mar 7, 2020')
    print(date)

但不断出错。 任何建议将不胜感激,谢谢

【问题讨论】:

    标签: python pandas zapier


    【解决方案1】:

    这是一种方法:

    def parse_email_range(date_string):
        dates = date_string.split(' - ')
    
        month_1 = pd.to_datetime(dates[0], format='%b %d').month
        month_2 = pd.to_datetime(dates[1]).month
    
        day_1 = pd.to_datetime(dates[0], format='%b %d').day
        day_2 = pd.to_datetime(dates[1]).day
    
        year_2 = pd.to_datetime(dates[1]).year
        year_1 = year_2 if (month_1 < month_2) or (month_1 == month_2 and day_1 < day_2) else year_2 - 1
    
        return '{}-{}-{}'.format(year_1, month_1, day_1), '{}-{}-{}'.format(year_2, month_2, day_2)
    
    parse_email_range('Dec 4 - Jan 4, 2020')
    
    ## ('2019-12-4', '2020-1-4')
    

    【讨论】:

    • 嗨@Oriol 我尝试运行它,但我收到第 13 行的无效语法错误 return pd.date_range(start=f'{year_1}-{month_1}-{day_1}', end= f'{year_2}-{month_2}-{day_2}') 我将如何只返回开始和结束日期与范围
    • 你运行的是什么 python 版本?如果你的 python 版本早于 3.6,那么你没有 f 字符串,你需要以不同的方式格式化日期。让我知道(或发布整个错误,以便我了解问题所在)。至于只获取范围的开始和结束,则不需要返回范围,只需返回两个值。您究竟希望函数返回什么?具有范围开始和结束的元组?一个列表?熊猫系列?做起来并不难,但你需要知道你需要什么。
    • 其运行版本为 3.7。只需要它返回格式为 %Y-%m-%d 的开始和结束日期。这是错误:'回溯(最近一次调用):文件“/usr/lib/python3.4/pdb.py”,第 1661 行,在主 pdb._runscript(mainpyfile)文件“/usr/lib/python3. 4/pdb.py”,第 1542 行,在 _runscript self.run(statement) 文件中“/usr/lib/python3.4/bdb.py”,第 431 行,在运行 exec(cmd, globals, locals) 文件中“",第 1 行,在 文件 "/home/main.py",第 14 行 return pd.date_range(start=f'{year_1}-{month_1}-{day_1}', end=f'{ year_2}-{month_2}-{day_2}') SyntaxError: invalid syntax'
    • 我修改了答案,只返回两个日期作为字符串。如果您仍然遇到错误,请告诉我。
    • 仍然收到错误文件“main.py”,第 14 行 return f'{year_1}-{month_1}-{day_1}', f'{year_2}-{month_2}-{day_2} ' ^ SyntaxError: 无效语法
    【解决方案2】:

    拆分两个日期并将它们记录到一个变量中:

    raw_dates = 'Dec 4 - Jan 4, 2020'.split(" - ")
    

    dateutil 包能够解析大多数日期:

    from dateutil.parser import parse
    

    从原始日期中解析并分离开始和结束日期:

    start_date, end_date = (parse(date) for date in raw_dates)
    

    strftime 是可用于格式化日期的方法。

    将所需的格式存储在一个变量中(请注意我使用的是 day first 格式):

    date_format = '%d/%m/%Y'
    

    将结束日期转换为所需的格式:

    print(end_date.strftime(date_format))
    
    '04/01/2020'
    

    转换开始日期:

    dateutilrelativedelta 函数将帮助我们从开始日期减去一年:

    from dateutil.relativedelta import relativedelta
    
    adjusted_start_date = start_date - relativedelta(years=1)
    
    print(adjusted_start_date.strftime(date_format))
    
    '04/12/2019'
    

    【讨论】:

    • 谢谢你,我会试试这个并回帖
    • 谢谢,这完美地解决了我的问题的第一部分 - 如果日期范围介于 2 个不同年份之间,例如 2020 年 12 月 4 日 - 1 月 4 日。但是当日期范围是在同一年,例如 2020 年 3 月 4 日至 4 月 4 日。关于如何解决这两种情况的任何建议?
    • @John 您使用什么标准来区分月份是当年还是去年?
    • 这就是我一直试图弄清楚的。我在想这样的事情:'如果'%m' == '12' in 'start_date' and '%m' != '12' in 'end_date': print (adjusted_start_date.strftime(date_format)) else: print (start_date .strftime(date_format))' 但是这段代码实际上没有任何建议?
    • 基本上只有在开始日期在 12 月而结束日期在不同月份时才会发生这种情况
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多