我有一个如下所示的数据框:
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
在time1
和time2
列中,我想将格式化为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 :(得分:0)
您可以将mask
与contains
一起使用,True
将to_timedelta
的输出应用于ns
的输出,因此需要进行除法:
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