微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将彼此在一个时间范围内的任意日期对象分组在一起

如何解决将彼此在一个时间范围内的任意日期对象分组在一起

import datetime as DT
import itertools

start_date=DT.date(2008,5,5)

def mkdate(datestring):
    return DT.datetime.strptime(datestring, "%Y-%m-%d").date()

def fortnight(date):
    return (date-start_date).days //14

raw = ("2010-08-01",
       "2010-06-25",
       "2010-07-01",
       "2010-07-08")
transactions=[(date,"Some data") for date in map(mkdate,raw)]
transactions.sort(key=lambda (date,data):date)

for key,grp in itertools.groupby(transactions,key=lambda (date,data):fortnight(date)):
    print(key,list(grp))

产量

# (55, [(datetime.date(2010, 6, 25), 'Some data')])
# (56, [(datetime.date(2010, 7, 1), 'Some data'), (datetime.date(2010, 7, 8), 'Some data')])
# (58, [(datetime.date(2010, 8, 1), 'Some data')])

请注意,2010-6-25是2008-5-5的第55个两周,而2010-7-1是第56个。如果您希望将它们组合在一起,只需进行更改start_date(更改为类似于2008-5-16的内容)。

PS。上面使用的关键工具是itertools.groupby此处将对其进行详细说明。

Edit: The lambdas are simply a way to make “anonymous” functions. (They are anonymous in the sense that they are not given names like functions defined by def). Anywhere you see a lambda, it is also possible to use adef to create an equivalent function. For example, you Could do this:

import operator
transactions.sort(key=operator.itemgetter(0))

def transaction_fortnight(transaction):
    date,data=transaction
    return fortnight(date)

for key,grp in itertools.groupby(transactions,key=transaction_fortnight):
    print(key,list(grp))

解决方法

我想将日历分为两周,从2008-May-5或任何任意的起点开始。

因此,我从几个日期对象开始:

import datetime as DT

raw = ("2010-08-01","2010-06-25","2010-07-01","2010-07-08")

transactions = [(DT.datetime.strptime(datestring,"%Y-%m-%d").date(),"Some data here") for datestring in raw]
transactions.sort()

通过手动分析日期,我完全能够弄清楚哪些日期属于同一两周间隔。我想得到与这个相似的分组:

# Fortnight interval 1
(datetime.date(2010,6,25),'Some data here')
(datetime.date(2010,7,1),8),'Some data here')

# Fortnight interval 2
(datetime.date(2010,8,'Some data here')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。