如何把这个时间数据改成H:M in python
How to change this time data into H:M in python
有一个包含持续时间列的数据集,其中时间数据列为如下所示的对象
df['duration'].head(10)
0 60 min.
1 1 hr. 13 min.
2 1 hr. 10 min.
3 52 min.
4 1 hr. 25 min.
5 45 min.
6 45 min.
7 60 min.
8 45 min.
9 45 min.
Name: duration, dtype: object
如何将其更改为合适的数值,如下所示?
0 00:60
1 01:13
2 01:10
3 00:52
4 01:25
5 00:45
您可以像这样在 duration
列上应用 lambda 函数:
import pandas as pd
import datetime as dt
def transform(t):
if 'hr.' in t:
return dt.datetime.strptime(t, '%I hr. %M min.').strftime('%I:%M')
return dt.datetime.strptime(t, '%M min.').strftime('00:%M')
df = pd.DataFrame(['45 min.', '1 hr. 13 min.'], columns=['duration'])
print(df)
df['duration'] = df['duration'].apply(lambda x: transform(x))
print(df)
输出:
duration
0 45 min.
1 1 hr. 13 min.
然后
duration
0 00:45
1 01:13
请注意,如果您想要“60 分钟”。映射到“00:60”,那么您需要在 transform
函数中添加一些额外的逻辑,因为分钟格式 %M
仅采用 00-59 之间的值。
这是一种获取 %H:%M
格式的字符串版本和时间增量版本的方法:
import pandas as pd
df = pd.DataFrame({'duration':['60 min.', '1 hr. 13 min.', '1 hr. 10 min.']})
print(df)
df['parts']=df.duration.str.findall('\d+')
df['timedelta']=df.parts.apply(lambda x: pd.to_timedelta((0 if len(x) < 2 else int(x[0])) * 3600 + int(x[-1])*60, unit='s'))
df['hours and minutes']=df.parts.apply(lambda x: f"{0 if len(x) < 2 else int(x[0]):02}:{int(x[-1]):02}")
df = df.drop(columns=['duration', 'parts'])
print(df)
输入:
duration
0 60 min.
1 1 hr. 13 min.
2 1 hr. 10 min.
输出:
timedelta hours and minutes
0 0 days 01:00:00 00:60
1 0 days 01:13:00 01:13
2 0 days 01:10:00 01:10
如果我们这样做:
print(df.timedelta.dtypes)
...我们看到 timedelta 列确实包含数值(timedelta 数据类型):
timedelta64[ns]
有一个包含持续时间列的数据集,其中时间数据列为如下所示的对象
df['duration'].head(10)
0 60 min.
1 1 hr. 13 min.
2 1 hr. 10 min.
3 52 min.
4 1 hr. 25 min.
5 45 min.
6 45 min.
7 60 min.
8 45 min.
9 45 min.
Name: duration, dtype: object
如何将其更改为合适的数值,如下所示?
0 00:60
1 01:13
2 01:10
3 00:52
4 01:25
5 00:45
您可以像这样在 duration
列上应用 lambda 函数:
import pandas as pd
import datetime as dt
def transform(t):
if 'hr.' in t:
return dt.datetime.strptime(t, '%I hr. %M min.').strftime('%I:%M')
return dt.datetime.strptime(t, '%M min.').strftime('00:%M')
df = pd.DataFrame(['45 min.', '1 hr. 13 min.'], columns=['duration'])
print(df)
df['duration'] = df['duration'].apply(lambda x: transform(x))
print(df)
输出:
duration
0 45 min.
1 1 hr. 13 min.
然后
duration
0 00:45
1 01:13
请注意,如果您想要“60 分钟”。映射到“00:60”,那么您需要在 transform
函数中添加一些额外的逻辑,因为分钟格式 %M
仅采用 00-59 之间的值。
这是一种获取 %H:%M
格式的字符串版本和时间增量版本的方法:
import pandas as pd
df = pd.DataFrame({'duration':['60 min.', '1 hr. 13 min.', '1 hr. 10 min.']})
print(df)
df['parts']=df.duration.str.findall('\d+')
df['timedelta']=df.parts.apply(lambda x: pd.to_timedelta((0 if len(x) < 2 else int(x[0])) * 3600 + int(x[-1])*60, unit='s'))
df['hours and minutes']=df.parts.apply(lambda x: f"{0 if len(x) < 2 else int(x[0]):02}:{int(x[-1]):02}")
df = df.drop(columns=['duration', 'parts'])
print(df)
输入:
duration
0 60 min.
1 1 hr. 13 min.
2 1 hr. 10 min.
输出:
timedelta hours and minutes
0 0 days 01:00:00 00:60
1 0 days 01:13:00 01:13
2 0 days 01:10:00 01:10
如果我们这样做:
print(df.timedelta.dtypes)
...我们看到 timedelta 列确实包含数值(timedelta 数据类型):
timedelta64[ns]