Python 使用Pandas获取csv中的时间戳

Python 使用Pandas获取csv中的时间戳,python,regex,pandas,Python,Regex,Pandas,我有一个csv,我想读入熊猫数据框并进行分析。其中一列称为“Date”,可以通过以下方式轻松转换为datetime类型: pd.to_datetime(df.Datum, format='%Y%m%d') 但是,该列不包含与该行关联的时间。时间(出于未知原因)包含在另一列的字符串中,相当于“注释”列。“注释”列中的示例条目类似于以下字符串: 'Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC' 我想提取单词“Transa

我有一个csv,我想读入熊猫数据框并进行分析。其中一列称为“Date”,可以通过以下方式轻松转换为datetime类型:

pd.to_datetime(df.Datum, format='%Y%m%d')
但是,该列不包含与该行关联的时间。时间(出于未知原因)包含在另一列的字符串中,相当于“注释”列。“注释”列中的示例条目类似于以下字符串:

'Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC'

我想提取单词“Transactie”之前的时间,在本例中是21:58。这可以在pandas中实现吗,或者我需要一个更通用的正则表达式包吗?

您可以利用pandas允许您沿列应用任何函数这一事实!我发现自己经常使用pandas文档中的
.apply(lambda x:function(x))

在您的情况下,您可以执行以下操作:

def datum_to_datetime(row):
    time = row['Datum'].split()[-3]

    return time

df.apply(datum_to_datetime)

您可以利用pandas允许您沿列应用任何函数这一事实!我发现自己经常使用pandas文档中的
.apply(lambda x:function(x))

在您的情况下,您可以执行以下操作:

def datum_to_datetime(row):
    time = row['Datum'].split()[-3]

    return time

df.apply(datum_to_datetime)
您可以使用
pd.Series.str
向量函数。比如说,

In[1]: df = pd.DataFrame({"Date": ["20160519", "20160519"], 
"Datum": ['Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC', 
          'Passnumber:123 19-05-2016 22:58 Transactie:123A12 Term:AABBC']})

In[2]: df.Datum.astype(str).str.split(pat=' ', expand=True)[2]
Out[2]: 
0    21:58
1    22:58
Name: 2, dtype: object
您可以使用
pd.Series.str
向量函数。比如说,

In[1]: df = pd.DataFrame({"Date": ["20160519", "20160519"], 
"Datum": ['Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC', 
          'Passnumber:123 19-05-2016 22:58 Transactie:123A12 Term:AABBC']})

In[2]: df.Datum.astype(str).str.split(pat=' ', expand=True)[2]
Out[2]: 
0    21:58
1    22:58
Name: 2, dtype: object
您可以使用或通过任意空格
\s+

import pandas as pd

df = pd.DataFrame({'Datum': ['Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC',
                            'Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC']})

print (df)
                                               Datum
0  Passnumber:123 19-05-2016 21:58 Transactie:123...
1  Passnumber:123 19-05-2016 21:58 Transactie:123...

df['Time'] = df.Datum.str.extract(r'([0-2]\d:[0-5]\d)', expand=True)

print (df)
                                               Datum   Time
0  Passnumber:123 19-05-2016 21:58 Transactie:123...  21:58
1  Passnumber:123 19-05-2016 21:58 Transactie:123...  21:58

print (df.Datum.str.split(r'\s+', expand=True)[2])
0    21:58
1    21:58
Name: 2, dtype: object
测试

似乎
extract
方法是最快的:

In [408]: %timeit (df.Datum.str.extract(r'([0-2]\d:[0-5]\d)', expand=True))
The slowest run took 4.96 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 347 µs per loop

In [409]: %timeit (df.Datum.str.split(r'\s+', expand=True)[2])
The slowest run took 4.63 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 675 µs per loop

In [410]: %timeit (df.Datum.astype(str).str.split(pat=' ', expand=True)[2])
The slowest run took 4.73 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 727 µs per loop
您可以使用或通过任意空格
\s+

import pandas as pd

df = pd.DataFrame({'Datum': ['Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC',
                            'Passnumber:123 19-05-2016 21:58 Transactie:123A12 Term:AABBC']})

print (df)
                                               Datum
0  Passnumber:123 19-05-2016 21:58 Transactie:123...
1  Passnumber:123 19-05-2016 21:58 Transactie:123...

df['Time'] = df.Datum.str.extract(r'([0-2]\d:[0-5]\d)', expand=True)

print (df)
                                               Datum   Time
0  Passnumber:123 19-05-2016 21:58 Transactie:123...  21:58
1  Passnumber:123 19-05-2016 21:58 Transactie:123...  21:58

print (df.Datum.str.split(r'\s+', expand=True)[2])
0    21:58
1    21:58
Name: 2, dtype: object
测试

似乎
extract
方法是最快的:

In [408]: %timeit (df.Datum.str.extract(r'([0-2]\d:[0-5]\d)', expand=True))
The slowest run took 4.96 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 347 µs per loop

In [409]: %timeit (df.Datum.str.split(r'\s+', expand=True)[2])
The slowest run took 4.63 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 675 µs per loop

In [410]: %timeit (df.Datum.astype(str).str.split(pat=' ', expand=True)[2])
The slowest run took 4.73 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 727 µs per loop

谢谢你的意见,但这并不能回答我的问题。我想获取字符串中包含的时钟时间,而不是将“Date”列转换为datetime对象。太好了,您可以传递任何函数。如果沿着整个数据帧应用,而不仅仅是一列,则可以跨多个列执行操作。查看我的编辑——如果您使用两列感兴趣的内容更新原始问题,这可能会有所帮助。谢谢您的输入,但这并不能回答我的问题。我想获取字符串中包含的时钟时间,而不是将“Date”列转换为datetime对象。太好了,您可以传递任何函数。如果沿着整个数据帧应用,而不仅仅是一列,则可以跨多个列执行操作。查看我的编辑——如果您使用两列可能有用的感兴趣的内容更新原始问题