2016-07-25 3 views
1

さまざまな日付の範囲で繰り返される大きなIDリストがあります。私は、IDの一意なリストを作成する必要があります。これには、未開封リストからの最も早い開始日と最新の終了日を含む日付の範囲が1つだけあります。日付の範囲を持つ一意のIDにリストを縮める

id start_date end_date 
    1 9/25/2015 10/12/2015 
    1 9/16/2015 11/1/2015 
    1 8/25/2015 9/21/2015 
    2 9/2/2015 10/29/2015 
    3 9/18/2015 10/15/2015 
    3 9/19/2015 9/30/2015 
    4 8/27/2015 9/15/2015 

そして、これは私が必要なものである:

これは私が持っているものの一例です。

id start_date end_date 
    1 8/25/2015 11/1/2015 
    2 9/2/2015 10/29/2015 
    3 9/18/2015 10/15/2015 
    4 8/27/2015 9/15/2015 

私はこれをPythonで手に入れようとしていますが、大したことはありません。ありがとう!

答えて

2

使用groupby/aggregate

In [12]: df.groupby('id').agg({'start_date':min, 'end_date':max}) 
Out[12]: 
    start_date end_date 
id      
1 2015-08-25 2015-11-01 
2 2015-09-02 2015-10-29 
3 2015-09-18 2015-10-15 
4 2015-08-27 2015-09-15 

minmaxは、各idの最小値と最大日付 sを返しますようにstart_dateend_dateは、日付として解析することが重要であること。値が単に日付の文字列表現である場合、minmax文字列 minまたはmaxを文字列の辞書順に依存します。日付文字列がYYYY/MM/DD形式の場合、辞書順は解析日の順番に対応しますが、MM/DD/YYYY形式の日付文字列にはこのプロパティがありません。

もしstart_dateend_dateは、日付に文字列を変換します、その後

for col in ['start_date', 'end_date']: 
    df[col] = pd.to_datetime(df[col]) 

、文字列値を持っています。

あなたがpd.read_table(またはpd.read_csv)を使用して、ファイルからのデータフレームをロードする場合は、その後、

df = pd.read_table(filename, ..., parse_dates=[1, 2]) 

は、日付など、ファイルの2列目と3列目の文字列を解析します。 [1, 2]は、Pythonが0ベースのインデックスを使用するため、2番目と3番目の列に対応します。

関連する問題