【问题标题】:Writing a tuple of character string with a specific range (Python)编写具有特定范围的字符串元组(Python)
【发布时间】:2013-10-17 15:10:51
【问题描述】:

请任何人帮助我编写正确的代码。 我正在尝试创建一个字符串元组,其中包含 Microsoft Excel 支持的日期范围内的日期,例如 ("2013-Oct-17", "2100-01-01")。

我的代码:

import time
import math


DAYS = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
FULL_MONTHS = ("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December")


mm_ = tuple(str(date) for date in range(2013-oct-17, 2100-01-01))
print mm_

运行时出现以下错误(输出):

mm_ = tuple(str(date) for date in range(2013-oct-17, 2100-01-01))
TypeError: unsupported operand type(s) for -: 'int' and 'builtin_function_or_method'

【问题讨论】:

  • 恐怕你需要先学习一些 Python 语法的基础知识。
  • 错误在这个“范围(2013-oct-17, 2100-01-01)”中,Python 将其解释为 2013 减去内置函数 oct 减去 17 并表示减去一个函数从整数没有意义。

标签: python python-3.x


【解决方案1】:

有很多库可以帮助您解决这个问题。我发现最有用的是熊猫。这是一个演示如何解决您的问题的 sn-p:

In [481]: import pandas as pd

In [482]: dates = pd.date_range('2013-10-17', '2100-01-01')

In [483]: mm_ = tuple(date.strftime('%Y-%m-%d') for date in dates)

In [484]: mm_[:5]
Out[484]: ('2013-10-17', '2013-10-18', '2013-10-19', '2013-10-20', '2013-10-21')

如 cmets 中所述,您必须以字符串形式输入日期。如果您想要长格式的日期和月份,您可以使用:

In [486]: nn_ = tuple(date.strftime('%A %B %d, %Y') for date in dates)

In [487]: nn_[:5]
Out[487]: 
('Thursday October 17, 2013',
'Friday October 18, 2013',
'Saturday October 19, 2013',
'Sunday October 20, 2013',
'Monday October 21, 2013')

请参阅http://docs.python.org/2/library/datetime.html 的底部,了解哪些字符代码代表哪些日期格式。

【讨论】:

    【解决方案2】:

    使用第三方库dateutil识别不同类型的日期字符串和内置模块datetime。如果不想使用 dateutil,可以使用datetime.datetime.strptime 尝试所有可能的格式并使用有效的格式。如果想在范围内包含结束日期,可以删除 -timedelta(days=1)

    from datetime import timedelta
    from dateutil.parser import parse
    from dateutil.rrule import rrule, DAILY
    
    dates = tuple(str(dt.date()) for dt in rrule(DAILY, dtstart=parse("2013-oct-17"), until=parse("2100-01-01")-timedelta(days=1)))
    print dates
    

    更新:小狗 Jon Clements 在 cmets 中提到了 dateutil.rrule.rrule,更新了代码以利用它。多亏了他,它现在是一个整洁的四班轮。

    【讨论】:

    • 如果您要引入另一个依赖项,那么至少要充分利用它 :) from dateutil.rrule import rrule, DAILY; dts = tuple(rrule(DAILY, date(2012, 10, 1), until=date.today())) 例如
    • @JonClements 哦,谢谢,我刚刚通过谷歌搜索看到了 dateutil,我会将您的方法添加到我的帖子中
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多