2016-04-28 2 views
2

私は、旅行の期間をテキスト値として含むデータフレームを、以下の列drive_duration_textに持っています。パンダで期間の異なるテキストフィールドを秒単位で変換

print df 

               yelp_id driving_duration_text \ 
0     alexander-rubin-photography-napa  1 hour 43 mins 
1        jumas-automotive-napa-2  1 hour 32 mins 
2      larson-brothers-painting-napa  1 hour 30 mins 
3       preferred-limousine-napa  1 hour 32 mins 
4       cardon-y-el-tirano-miami  1 day 16 hours 
5         sweet-dogs-miami  1 day 3 hours 

ご覧のとおり、いくつかは時間単位で、その他は日単位で書かれています。どのように私はこの形式を秒に変換できますか?

答えて

2

UPDATE:

In [150]: df['seconds'] = (pd.to_timedelta(df['driving_duration_text'] 
    .....:         .str.replace(' ', '') 
    .....:         .str.replace('mins', 'min')) 
    .....:     .dt.total_seconds()) 

In [151]: df 
Out[151]: 
          yelp_id driving_duration_text seconds 
0 alexander-rubin-photography-napa  1 hour 43 mins 6180.0 
1   jumas-automotive-napa-2  1 hour 32 mins 5520.0 
2  larson-brothers-painting-napa  1 hour 30 mins 5400.0 
3   preferred-limousine-napa  1 hour 32 mins 5520.0 
4   cardon-y-el-tirano-miami  1 day 16 hours 144000.0 
5     sweet-dogs-miami  1 day 3 hours 97200.0 

OLD答え:

あなたはこのようにそれを行うことができます。

from collections import defaultdict 
import re 

def humantime2seconds(s): 
    d = { 
     'w':  7*24*60*60, 
     'week': 7*24*60*60, 
     'weeks': 7*24*60*60, 
     'd':  24*60*60, 
     'day': 24*60*60, 
     'days': 24*60*60, 
     'h':  60*60, 
     'hr':  60*60, 
     'hour': 60*60, 
     'hours': 60*60, 
     'm':  60, 
     'min': 60, 
     'mins': 60, 
     'minute': 60, 
     'minutes':60 
    } 
    mult_items = defaultdict(lambda: 1).copy() 
    mult_items.update(d) 

    parts = re.search(r'^(\d+)([^\d]*)', s.lower().replace(' ', '')) 
    if parts: 
     return int(parts.group(1)) * mult_items[parts.group(2)] + humantime2seconds(re.sub(r'^(\d+)([^\d]*)', '', s.lower())) 
    else: 
     return 0 

df['seconds'] = df.driving_duration_text.map(humantime2seconds) 

出力:

In [64]: df 
Out[64]: 
          yelp_id driving_duration_text seconds 
0 alexander-rubin-photography-napa  1 hour 43 mins  6180 
1   jumas-automotive-napa-2  1 hour 32 mins  5520 
2  larson-brothers-painting-napa  1 hour 30 mins  5400 
3   preferred-limousine-napa  1 hour 32 mins  5520 
4   cardon-y-el-tirano-miami  1 day 16 hours 144000 
5     sweet-dogs-miami  1 day 3 hours 97200 
+0

@unutbu、訂正ありがとうございます!私は私の答えを更新しました – MaxU

+0

私はあなたの古い答えを得ましたが、ValueError:あなたのアップデートの回答にもかかわらず、ありがたいことにtimedelta文字列コンバータを作成できません! –

+0

@ JasonMeloHall:アップデートされた回答を得るには、あなたのバージョンのpandasをアップグレードする必要があります(http://stackoverflow.com/questions/28294803/calculate-total-of-string-column#comment44989331_28302352)。 – unutbu

1

テキストが標準化された形式に従っているように見える場合、これは比較的簡単です。文字列を分割して関連する部分にまとめて処理する必要があります。

def parse_duration(duration): 
    items = duration.split() 
    words = items[1::2] 
    counts = items[::2] 
    seconds = 0 
    for i, each in enumerate(words): 
     seconds += get_seconds(each, counts[i]) 
    return seconds 

def get_seconds(word, count): 
    counts = { 
     'second': 1, 
     'minute': 60, 
     'hour': 3600, 
     'day': 86400 
     # and so on 
    } 
    # Bit complicated here to handle plurals 
    base = counts.get(word[:-1], counts.get(word, 0)) 
    return base * count 
+0

良い答え。私はこの方法が好きです。 – DJGrandpaJ

関連する問題