2017-02-04 171 views
1

我有一個數據幀,看起來像這樣:熊貓轉換日期時間,以分鐘

import pandas as pd 

name = pd.Series(["A", "B", "C", "D", "E", "F"]) 
c1 = pd.Series(["0", "0", "01:56:00", "10:01:00", "120", "2 hours"]) 
c2 = pd.Series(["00:60:00", "0", "10", "12:00:00", "20 mins", "100"]) 
df = pd.DataFrame({"name": name, "time1": c1, "time2": c2}) 
print(df) 

    name  time1  time2 
0 A   0 00:60:00 
1 B   0   0 
2 C 01:56:00  10 
3 D 10:01:00 12:00:00 
4 E  120 20 mins 
5 F 2 hours  100 

time1time2列我想格式化像一個datetime值轉換(小時:分鐘:秒)到分鐘。所需的輸出是這樣的:

name time1 time2 
0 A  0  60 
1 B  0  0 
2 C  116  10 
3 D  601  720 
4 E  120 20 mins 
5 F 2 hours  100 

這是混亂的,因爲不是所有的值被格式化爲一個日期,以及一些細胞中含有的話(例如分鐘,小時),我想獨自離開現在

我想出了一種方法,通過遍歷行來替換日期時間值,檢查單元格是否包含:,如果是的話進行簡單的轉換。但是,這種方法不能很好地擴展。有沒有更自然的方式在熊貓中做到這一點?

回答

0

您可以使用maskcontains,並在那裏Truens與輸出應用的to_timedelta輸出,這樣分工是必要的:

mask1 = df.time1.str.contains(':') 
mask2 = df.time2.str.contains(':') 
const = 6 * 10**10 #ns -> min 
df.time1 = df.time1.mask(mask1, pd.to_timedelta(df.time1, errors='coerce')/const) 
df.time2 = df.time2.mask(mask2, pd.to_timedelta(df.time2, errors='coerce')/const) 

print (df) 
    name time1 time2 
0 A  0  60 
1 B  0  0 
2 C  116  10 
3 D  601  720 
4 E  120 20 mins 
5 F 2 hours  100 
+0

這似乎爲我張貼的例子中工作,但我的實際數據(其太大而無法在這裏發佈)當我嘗試將遮罩應用於列時,出現以下錯誤:'一元操作符的壞操作數類型:'float''。錯誤從何而來? – Simon

+1

它在實際數據中似乎有些NaN,所以在'str.contains'中需要參數'na = False'。 – jezrael