在我的数据框中,有一列包含这样的值:
PowerPlayTimeOnIce
0:05
0:05
1:24
3:29
1:34
0
0:05
0
0
如何将它们转换为浮点数?
此方法无效:
df["powerPlayTimeOnIce"] = df["powerPlayTimeOnIce"].astype('float')
编辑:更新了数据示例以更好地解决问题
答案 0 :(得分:3)
使用to_datetime
s=pd.to_datetime(df.PowerPlayTimeOnIce,format='%M:%S')
s.dt.minute*60+s.dt.second
Out[881]:
0 5
1 5
2 84
3 209
4 94
5 5
Name: PowerPlayTimeOnIce, dtype: int64
更新
s=pd.to_datetime(df.PowerPlayTimeOnIce,format='%M:%S',errors='coerce')
(s.dt.minute*60+s.dt.second).fillna(0)
Out[886]:
0 5.0
1 5.0
2 84.0
3 209.0
4 94.0
5 5.0
6 0.0
Name: PowerPlayTimeOnIce, dtype: float64
数据输入
PowerPlayTimeOnIce
0 0:05
1 0:05
2 1:24
3 3:29
4 1:34
5 0:05
6 0
答案 1 :(得分:2)
您可以执行以下操作:
import pandas as pd
data = ['0:05',
'0:05',
'1:24',
'3:29',
'1:34',
'0:05']
def convert(s):
minutes, seconds = map(int, s.split(":"))
return 60 * minutes + seconds
df = pd.DataFrame(data=data, columns=['powerPlayTimeOnIce'])
print(df['powerPlayTimeOnIce'].apply(convert))
输出
0 5
1 5
2 84
3 209
4 94
5 5
Name: powerPlayTimeOnIce, dtype: int64
答案 2 :(得分:1)
如果您想要非常冗长的流程并且没有庞大的数据集。您可以这样做:
df[['min', 'sec']] = df['powerPlayTimeOnIce'].str.split(':', expand=True)
df[['min'] = df[['min'].astype('int')
df['sec'] = df['sec'].apply(lambda x: float('0.'+x), axis=1)
df['diff_in_seconds'] = df['min']/60 + df['sec']
因此,我将您的数据分为分钟和秒。从那里您可以转换为任何格式。
答案 3 :(得分:0)
您可以使用pd.to_timedelta
+ .total_seconds()
访问器。首先,您需要正确设置字符串格式(HH:mm:ss),因为您无法指定格式。尽管可能与冰球时代无关,但这可以处理很多时间而没有太多问题。
import pandas as pd
s = df.PowerPlayTimeOnIce.replace(':', '', regex=True).str.zfill(6)
pd.to_timedelta(s.str[0:-4]+':'+s.str[-4:-2]+':'+s.str[-2::]).dt.total_seconds()
0 5.0
1 5.0
2 84.0
3 209.0
4 94.0
5 5.0
6 0.0
7 446161.0
8 4046161.0
Name: PowerPlayTimeOnIce, dtype: float64
PowerPlayTimeOnIce
0 0:05
1 0:05
2 1:24
3 3:29
4 1:34
5 0:05
6 0
7 123:56:01
8 1123:56:01