4

2008-May-5カレンダーを、または任意の開始点から始まる2週間の間隔に分割したいと思います。

だから私はいくつかの日付オブジェクトから始めます:

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()

日付を手動で分析することにより、どの日付が同じ2週間の間隔内にあるかをかなり把握できます。これに似たグループ化を取得したい:

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

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

3 に答える 3

12
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番目の2週間であり、2010-7-1は56番目であることに注意してください。それらをグループ化する場合は、単に変更しますstart_date(2008-5-16のようなものに変更します)。

PS。上で使用した主要なツールはです。これについては、ここitertools.groupbyで詳しく説明します。

編集:lambdasは単に「匿名」関数を作成する方法です。(これらは、によって定義された関数のような名前が付けられていないという意味で匿名ですdef)。ラムダが表示される場所であればどこでも、を使用しdefて同等の関数を作成することもできます。たとえば、次のようにすることができます。

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))
于 2010-08-07T12:35:15.767 に答える
4

itertools groupbyとlambda関数を使用して、開始点からの距離を期間の長さで除算します。

>>> for i, group in groupby(range(30), lambda x: x // 7):
    print list(group)


[0, 1, 2, 3, 4, 5, 6]
[7, 8, 9, 10, 11, 12, 13]
[14, 15, 16, 17, 18, 19, 20]
[21, 22, 23, 24, 25, 26, 27]
[28, 29]

だから日付で:

import itertools as it
start = DT.date(2008,5,5)
lenperiod = 14

for fnight,info in it.groupby(transactions,lambda data: (data[0]-start).days // lenperiod):
    print list(info)

strftimeのweeknumbersと週数のlenperiodも使用できます。

for fnight,info in it.groupby(transactions,lambda data: int (data[0].strftime('%W')) // lenperiod):
    print list(info)
于 2010-08-07T12:36:17.370 に答える
1

作品でパンダDataFrameを使うことresampleも。OPのデータを指定しますが、「ここにあるデータ」を「abcd」に変更します。

>>> 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"), data) for
...                 datestring, data in zip(raw,'abcd')]
[(datetime.datetime(2010, 8, 1, 0, 0), 'a'),
 (datetime.datetime(2010, 6, 25, 0, 0), 'b'),
 (datetime.datetime(2010, 7, 1, 0, 0), 'c'),
 (datetime.datetime(2010, 7, 8, 0, 0), 'd')]

パンダを使ってみてください。まず、を作成しDataFrame、列に名前を付け、インデックスを日付に設定します。

>>> import pandas as pd
>>> df = pd.DataFrame(transactions,
...                   columns=['date','data']).set_index('date')
           data
date
2010-08-01    a
2010-06-25    b
2010-07-01    c
2010-07-08    d

次に、日曜日から2週間ごとにシリーズオフセットエイリアスを使用して、結果を連結します。

>>> fortnight = df.resample('2W-SUN').sum()
           data
date
2010-06-27    b
2010-07-11   cd
2010-07-25    0
2010-08-08    a

必要に応じて、weekstartまでにデータをドリルダウンします

>>> fortnight.loc['2010-06-27']['data']
b

またはインデックス

>>> fortnight.iloc[0]['data']
b

またはインデックス

>>> data = fortnight.iloc[:2]['data']
b
date
2010-06-27     b
2010-07-11    cd
Freq: 2W-SUN, Name: data, dtype: object
>>> data[0]
b
>>> data[1]
cd
于 2016-03-25T23:17:03.137 に答える