我想将hh:mm格式的数据集中的列转换为分钟。我尝试了以下代码,但它显示“ AttributeError:'Series'对象没有属性'split'”。数据采用以下格式。我在数据集中也有nan值,计划是计算值的中位数,然后用中位数填充具有nan的行
02:32
02:14
02:31
02:15
02:28
02:15
02:22
02:16
02:22
02:14
到目前为止,我已经尝试过
s = dataset['Enroute_time_(hh mm)']
hours, minutes = s.split(':')
int(hours) * 60 + int(minutes)
答案 0 :(得分:2)
我建议您避免按行计算。您可以对Pandas / NumPy使用矢量化方法:
df = pd.DataFrame({'time': ['02:32', '02:14', '02:31', '02:15', '02:28', '02:15',
'02:22', '02:16', '02:22', '02:14', np.nan]})
values = df['time'].fillna('00:00').str.split(':', expand=True).astype(int)
factors = np.array([60, 1])
df['mins'] = (values * factors).sum(1)
print(df)
time mins
0 02:32 152
1 02:14 134
2 02:31 151
3 02:15 135
4 02:28 148
5 02:15 135
6 02:22 142
7 02:16 136
8 02:22 142
9 02:14 134
10 NaN 0
答案 1 :(得分:1)
如果要使用split
,则需要使用str
访问器,即s.str.split(':')
。
但是我认为在这种情况下,使用apply
更有意义:
df = pd.DataFrame({'Enroute_time_(hh mm)': ['02:32', '02:14', '02:31',
'02:15', '02:28', '02:15',
'02:22', '02:16', '02:22', '02:14']})
def convert_to_minutes(value):
hours, minutes = value.split(':')
return int(hours) * 60 + int(minutes)
df['Enroute_time_(hh mm)'] = df['Enroute_time_(hh mm)'].apply(convert_to_minutes)
print(df)
# Enroute_time_(hh mm)
# 0 152
# 1 134
# 2 151
# 3 135
# 4 148
# 5 135
# 6 142
# 7 136
# 8 142
# 9 134
答案 2 :(得分:1)
我了解到您在DataFrame中有一列带有多个Timedeltas作为字符串。然后,您要提取增量的总分钟数。之后,您要用总分钟数的中位数填充NaN值。
import pandas as pd
df = pd.DataFrame(
{'hhmm' : ['02:32',
'02:14',
'02:31',
'02:15',
'02:28',
'02:15',
'02:22',
'02:16',
'02:22',
'02:14']})
您的Timedeltas不是Timedeltas。它们是字符串。因此,您需要先进行转换。
df.hhmm = pd.to_datetime(df.hhmm, format='%H:%M')
df.hhmm = pd.to_timedelta(df.hhmm - pd.datetime(1900, 1, 1))
这将为您提供以下值(请注意dtype:timedelta64 [ns]此处)
0 02:32:00
1 02:14:00
2 02:31:00
3 02:15:00
4 02:28:00
5 02:15:00
6 02:22:00
7 02:16:00
8 02:22:00
9 02:14:00
Name: hhmm, dtype: timedelta64[ns]
现在您有了真实的时间增量,您可以使用一些很酷的功能,例如total_seconds()
,然后计算分钟数。
df.hhmm.dt.total_seconds() / 60
如果这不是您想要的,也可以使用以下内容。
df.hhmm.dt.components.minutes
这为您提供了HH:MM字符串中的分钟记录,就好像您将其拆分一样。
填充na值。
df.hhmm.fillna((df.hhmm.dt.total_seconds() / 60).mean())
或
df.hhmm.fillna(df.hhmm.dt.components.minutes.mean())