2015-04-20 142 views
0

我想將數據框中的一列像'12:51 AM'轉換爲'01'(相當於'01:00'的24小時時間)。是的,我想把它四捨五入到最近的小時。Python日期時間變換

例如,說我的數據幀是:

Time 
12:51 AM 
1:51 AM 
2:03 AM 
4:23 PM 

我想將它更改爲:

Time 
01 
02 
02 
16 

我的方法:

首先,拆分每個字符串,說'12: 51 AM'分爲兩部分 - '12:51'和'AM'。 然後,使用循環,如果要實現這一點。

我正在尋找更有效的方法,就像使用datetime包一樣。

非常感謝。

回答

1

time.strptime()符合您的需求。

from time import strptime 

def transform(data_frame): 
    time = strptime(data_frame, "%I:%M %p") 
    hour = time.tm_hour 
    if time.tm_min >= 30: 
     if hour < 23: 
      hour += 1 
     else: 
      hour = 0 
    return hour 

values = "12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM" 

for value in values: 
    print(transform(value)) 

輸出:

1 
2 
2 
16 

希望它能幫助!

+0

謝謝!它有助於 ! – Chianti5

0

我同意cdonts。這裏是一個Python的解決方案

from time import strptime as st 

times = "12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM" 
for time in times: 
    print(st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30) 

根據您的需求,你可能要存儲在列表中的結果(或數據類型您選擇的)

times = [st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30 for time in("12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM")] 

目前尚不清楚在那裏你會拉着你時間從。如果不是用戶輸入並某處以備以後檢索存儲您可能需要編寫檢索值的函數,並返回,然後可以像這樣

times = [st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30 for time in retrieve(args)] 

希望使用的列表這有助於

1

有現有的答案沒有錯,但他們沒有使用任何內置的熊貓解決方案,可以使事情變得更容易。如果你以字符串格式開始,你可以轉換爲日期時間,然後使用熊貓dt來提取小時等。

df['Time2'] = pd.to_datetime(df.Time) 

     Time    Time2 
0 12:51 AM 2015-04-20 00:51:00 
1 1:51 AM 2015-04-20 01:51:00 
2 2:03 AM 2015-04-20 02:03:00 
3 4:23 PM 2015-04-20 16:23:00 

現在你可以提取小時/分鐘/等。很容易用dt方法。

df['Time2'].dt.hour + df['Time2'].dt.minute.div(30).astype(int) 

0  1 
1  2 
2  2 
3 16 

有用的文檔:

dt accessor

converting to timestamps

+0

噢,好的,謝謝@EdChum。這也很容易,我會添加它來回答。 – JohnE