Reputation: 95
I have a timedelta Dataframe
JC time
1 3days 21:02:05
2 1days 23:50:07
3 6days 19:28:36
but i want
1 93:02:05
2 47:50:07
3 163:28:36
How can I convert it?
Upvotes: 4
Views: 7045
Reputation: 1527
Here is another approach:
def strf_delta(td):
h, r = divmod(int(td.total_seconds()), 60*60)
m, s = divmod(r, 60)
h, m, s = (str(x).zfill(2) for x in (h, m, s))
return f"{h}:{m}:{s}"
d['time'].apply(strf_delta)
Upvotes: 1
Reputation: 71689
Use, the combination of pd.to_timedelta
, Series.dt.components
, DataFrame.agg
& Series.str.zfill
:
d = pd.to_timedelta(df['time']).dt.components[['days', 'hours', 'minutes', 'seconds']]
d['hours'] = d['hours'].add(d.pop('days') * 24)
df['time'] = d.astype(str).agg(lambda s: ':'.join(s.str.zfill(2)), axis=1)
Result:
# print(df)
JC time
0 1 93:02:05
1 2 47:50:07
2 3 163:28:36
Upvotes: 4
Reputation: 168
You could do as follows to convert a timedelta
to the number of hours, minutes and seconds in the format you want:
def convert_to_hours(delta):
total_seconds = delta.total_seconds()
hours = str(int(total_seconds // 3600)).zfill(2)
minutes = str(int((total_seconds % 3600) // 60)).zfill(2)
seconds = str(int(total_seconds % 60)).zfill(2)
return f"{hours}:{minutes}:{seconds}"
delta = timedelta(days=3, hours=21, minutes=2, seconds=5)
# 3 days, 21:02:05
convert_to_hours(delta)
# 93:02:05
And to convert your dataframe, you can do something like this:
df["time"] = df["time"].apply(convert_to_hours)
Upvotes: 2