Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫;将带有MM:SS的列,小数转换为秒数_Python_String_Parsing_Pandas_Timedelta - Fatal编程技术网

Python 熊猫;将带有MM:SS的列,小数转换为秒数

Python 熊猫;将带有MM:SS的列,小数转换为秒数,python,string,parsing,pandas,timedelta,Python,String,Parsing,Pandas,Timedelta,嘿:花了好几个小时试着做一件很简单的事,但还是想不出来 我有一个数据帧,它有一列df['Time'],其中包含时间,从0开始,最多20分钟,如下所示: 1:10,10 1:16,32 3:03,04 第一个是分钟,第二个是秒,第三个是毫秒(只有两位数) 有没有办法用Pandas自动将该列转换为秒,而不将该列作为系列的时间索引 我已经尝试了以下方法,但无效: pd.to_datetime(df['Time']).convert('s') # AttributeError: 'Series'

嘿:花了好几个小时试着做一件很简单的事,但还是想不出来

我有一个数据帧,它有一列df['Time'],其中包含时间,从0开始,最多20分钟,如下所示:

1:10,10
1:16,32
3:03,04
第一个是分钟,第二个是秒,第三个是毫秒(只有两位数)

有没有办法用Pandas自动将该列转换为秒,而不将该列作为系列的时间索引

我已经尝试了以下方法,但无效:

pd.to_datetime(df['Time']).convert('s')   # AttributeError: 'Series' object has no attribute 'convert'
如果唯一的方法是分析时间,请指出这一点,我将为这个问题准备一个适当/详细的答案,不要浪费你的时间=) 谢谢大家!

代码:

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
输出:

      Time                       time       timedelta    secs
0  1:10,10 1900-01-01 00:01:10.100000 00:01:10.100000   70.10
1  1:16,32 1900-01-01 00:01:16.320000 00:01:16.320000   76.32
2  3:03,04 1900-01-01 00:03:03.040000 00:03:03.040000  183.04
       Time        timedelta    secs
0  -1:10,10 -00:01:10.100000  -70.10
1   1:16,32  00:01:16.320000   76.32
2   3:03,04  00:03:03.040000  183.04
如果您还有负时间增量:

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}))?")

def parse_time(time_str):
    parts = regex.match(time_str)
    if not 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']*10
    del time_params['centiseconds']
    return (-1 if parts['minus'] else 1) * 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
代码:

输出:

      Time                       time       timedelta    secs
0  1:10,10 1900-01-01 00:01:10.100000 00:01:10.100000   70.10
1  1:16,32 1900-01-01 00:01:16.320000 00:01:16.320000   76.32
2  3:03,04 1900-01-01 00:03:03.040000 00:03:03.040000  183.04
       Time        timedelta    secs
0  -1:10,10 -00:01:10.100000  -70.10
1   1:16,32  00:01:16.320000   76.32
2   3:03,04  00:03:03.040000  183.04
如果您还有负时间增量:

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}))?")

def parse_time(time_str):
    parts = regex.match(time_str)
    if not 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']*10
    del time_params['centiseconds']
    return (-1 if parts['minus'] else 1) * 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

谢谢但是如何将每一行转换为秒呢?例如:['70.10','76.32',等等]非常感谢,你的回答解决了我的问题。但我想知道,如果时间是负时间呢?(即:我们正在跟踪一个事件,我们想在20秒前做一些事情)。这个解决方案也有效吗?谢谢!但是如何将每一行转换为秒呢?例如:['70.10','76.32',等等]非常感谢,你的回答解决了我的问题。但我想知道,如果时间是负时间呢?(即:我们正在跟踪一个事件,我们想在20秒前做一些事情)。这个解决方案也有效吗?