我有這樣的datafremae
time_posted
0 5 days ago
1 an hour ago
2 a day ago
3 6 hours ago
4 4 hours ago
我嘗試了這個df.sort_values(by='time_posted',ascending=True)并得到了這個結果:
time_posted
4 4 hours ago
0 5 days ago
3 6 hours ago
2 a day ago
1 an hour ago
但我想縮短價值,hours ago所以我的 datframe 看起來像這樣
time_posted
1 an hour ago
4 4 hours ago
3 6 hours ago
2 a day ago
0 5 days ago
uj5u.com熱心網友回復:
如果洗掉“ago”并將“a/an”替換為 1,則可以將值提供給pandas.to_timedelta:
(pd.to_timedelta(df['time_posted']
.str.replace(r'\ban?\b', '1', regex=True)
.str.replace(' ago', '', regex=False))
)
輸出:
0 5 days 00:00:00
1 0 days 01:00:00
2 1 days 00:00:00
3 0 days 06:00:00
4 0 days 04:00:00
Name: time_posted, dtype: timedelta64[ns]
這使您能夠獲得排序順序:
idx = (pd.to_timedelta(df['time_posted']
.str.replace(r'\ban?\b', '1', regex=True)
.str.replace(' ago', '', regex=False))
.sort_values()
.index
)
df.loc[idx]
輸出:
time_posted
1 an hour ago
4 4 hours ago
3 6 hours ago
2 a day ago
0 5 days ago
uj5u.com熱心網友回復:
一個答案可能如下
設定示例資料
import pandas as pd
#your dataframe
df = pd.DataFrame(dict(time_posted=['5 days ago', 'an hour ago', 'a day ago', '6 hours ago', '4 hours ago']))
轉換函式
您必須拆分字串并決定不同的值(這里x[0]是一個值和x[1]一個單位)
def to_hours(s):
x = s.split(' ')
if x[0].lower() in ['a','an']:
a = 1
else:
a = float(x[0])
x1 = x[1].lower()
b = 1 # 1 hour
if x[1].startswith('day'):
b = b*24 # 1 day = 24 hours
return a*b
應用
df['hours'] = df.time_posted.apply(to_hours) # apply hours conversion
df = df.sort_values('hours',ascending=True)[['time_posted']]# Sort and skip non-necessary col
print(df)
輸出:
time_posted
1 an hour ago
4 4 hours ago
3 6 hours ago
2 a day ago
0 5 days ago
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472614.html
標籤:Python python-3.x 熊猫 数据框 约会时间
上一篇:C 中的日期時間決議和格式化
