Python 使用Pandas获取csv中的时间戳
我有一个csv,我想读入熊猫数据框并进行分析。其中一列称为“Date”,可以通过以下方式轻松转换为datetime类型: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
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对象。太好了,您可以传递任何函数。如果沿着整个数据帧应用,而不仅仅是一列,则可以跨多个列执行操作。查看我的编辑——如果您使用两列可能有用的感兴趣的内容更新原始问题