2017-02-04 94 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