假设我有2个字符串'Jan-2010'和'Mar-2010',我想解析它,它返回2个日期时间对象:2010年1月1日和2010年3月31日(即最后一天).
什么是python中最好的策略?我应该只是将字符串拆分为令牌或使用正则表达式然后使用日历函数来说明"Mar-2010"的月份的最后一天(第一天是微不足道的,在这种情况下它总是1,除非我想要这个月的第一个工作日).
有什么建议?提前致谢.
strptime 字符串是否代表您解析为日期:
def firstofmonth(MmmYyyy):
return datetime.datetime.strptime(MmmYyyy, '%b-%Y').date()
Run Code Online (Sandbox Code Playgroud)
比使用标记化,正则表达式和&c! - 更好.
要获取该月最后一天的日期,您确实可以使用日历模块:
def lastofmonth(MmmYyyy):
first = firstofmonth(MmmYyyy)
_, lastday = calendar.monthrange(first.year, first.month)
return datetime.date(first.year, first.month, lastday)
Run Code Online (Sandbox Code Playgroud)
您几乎可以单独使用日期时间来完成它,例如ALMOST工作方法:
def lastofmonth(MmmYyyy):
first = firstofmonth(MmmYyyy)
return first.replace(month=first.month+1, day=1
) - datetime.timedelta(days=1)
Run Code Online (Sandbox Code Playgroud)
但是,唉!,这打破了12月,特殊情况12月需要的代码使整体方法比日历提供更好;-).
from datetime import datetime, timedelta
def first_day(some_date):
return some_date.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
def next_month(some_date):
return first_day(first_day(some_date) + timedelta(days=31))
def last_day(some_date):
return next_month(some_date) - timedelta(days=1)
# testing:
months = [('Jan-2010', 'Mar-2010'), # your example
('Apr-2009', 'Apr-2009'), # same month, 30 days
('Jan-2008', 'Dec-2008'), # whole year
('Jan-2007', 'Feb-2007')] # february involved
for date1, date2 in months:
print first_day(datetime.strptime(date1, '%b-%Y')),
print '-',
print last_day(datetime.strptime(date2, '%b-%Y'))
Run Code Online (Sandbox Code Playgroud)
打印:
2010-01-01 00:00:00 - 2010-03-31 00:00:00
2009-04-01 00:00:00 - 2009-04-30 00:00:00
2008-01-01 00:00:00 - 2008-12-31 00:00:00
2007-01-01 00:00:00 - 2007-02-28 00:00:00
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |