Pandas; Transform Column With Mm:ss,decimals Into Number Of Seconds
Hey: Spent several hours trying to do a quite simple thing,but couldnt figure it out. I have a dataframe with a column, df['Time'] which contains time, starting from 0, up to 20 mi
Solution 1:
Code:
import pandas as pd
import numpy as np
import datetime
df = pd.DataFrame({'Time':['1:10,10', '1:16,32', '3:03,04']})
df['time'] = df.Time.apply(lambda x: datetime.datetime.strptime(x,'%M:%S,%f'))
df['timedelta'] = df.time - datetime.datetime.strptime('00:00,0','%M:%S,%f')
df['secs'] = df['timedelta'].apply(lambda x: x / np.timedelta64(1, 's'))
print df
Output:
Timetimetimedeltasecs01:10,101900-01-01 00:01:10.100000 00:01:10.10000070.1011:16,321900-01-01 00:01:16.320000 00:01:16.32000076.3223:03,041900-01-01 00:03:03.040000 00:03:03.040000183.04
If you have also negative time deltas:
import pandas as pd
import numpy as np
import datetime
import re
regex = re.compile(r"(?P<minus>-)?((?P<minutes>\d+):)?(?P<seconds>\d+)(,(?P<centiseconds>\d{2}))?")
defparse_time(time_str):
parts = regex.match(time_str)
ifnot parts:
return
parts = parts.groupdict()
time_params = {}
for (name, param) in parts.iteritems():
if param and (name != 'minus'):
time_params[name] = int(param)
time_params['milliseconds'] = time_params['centiseconds']*10del time_params['centiseconds']
return (-1if parts['minus'] else1) * datetime.timedelta(**time_params)
df = pd.DataFrame({'Time':['-1:10,10', '1:16,32', '3:03,04']})
df['timedelta'] = df.Time.apply(lambda x: parse_time(x))
df['secs'] = df['timedelta'].apply(lambda x: x / np.timedelta64(1, 's'))
print df
Output:
Time timedelta secs
0 -1:10,10 -00:01:10.100000 -70.1011:16,3200:01:16.32000076.3223:03,0400:03:03.040000183.04
Post a Comment for "Pandas; Transform Column With Mm:ss,decimals Into Number Of Seconds"