熊猫将日期时间转换为分钟

时间:2017-02-04 08:13:11

标签: python pandas datetime dataframe

我有一个如下所示的数据框:

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

这很麻烦,因为并非所有的值都被格式化为日期时间,而且有些单元格包含我想暂时留下的单词(例如分钟,小时)

我想出了一种方法,通过迭代行来替换日期时间值,检查单元格是否包含:,如果是,则进行简单的转换。但是,这种方法并不能很好地扩展。在熊猫中有更自然的方式吗?

1 个答案:

答案 0 :(得分:0)

您可以将maskcontains一起使用,Trueto_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