【问题标题】:Parsing a list of string by the last occurring space python通过最后出现的空间python解析字符串列表
【发布时间】:2019-02-17 16:07:18
【问题描述】:

我有一个字符串列表,其中包含我需要按最后一个或倒数第二个空格 (dateTime) 解析的空格。我已经在主字符串上尝试了 split() ,但问题是包含很多空格来描述数据,所以我推迟使用 split(/n) 。请参阅下面的示例列表。

['Origin Time       2016/04/16 01:25:00',
 'Lat.              32.753',
 'Long.             130.762',
 'Depth. (km)       12',
 'Mag.              7.3',
 'Station Code      AIC001',
 'Station Lat.      35.2976',
 'Station Long.     136.7500',
 'Station Height(m) 6',
 'Record Time       2016/04/16 01:28:06',
 'Sampling Freq(Hz) 100Hz',
 'Duration Time(s)  120',
 'Dir.              N-S',
 'Scale Factor      7845(gal)/8223790',
 'Max. Acc. (gal)   2.327',
 'Last Correction   2016/04/16 01:28:08'

我不确定最好的角度是拆分此列表的第一个和最后一个元素,我想将它们分开以便我可以从中创建一个 pandas Dataframe。

【问题讨论】:

  • 您可以尝试只在分割所在的 index 上分割字符串,因为按最右边的空格分割不是此数据集的有效规则。值开始的索引在您的示例中始终相同。

标签: python pandas list split


【解决方案1】:

这看起来很像一个固定宽度的格式文件,而不是使用分隔符格式化的文件。如果您的 pre-split 字符串在 original 中,则使用 pd.read_fwf 和默认的“猜测列”推理引擎将真正适用于您的示例:

import io, pandas as pd
df = pd.read_fwf(io.StringIO(original), header=None)

但我认为通过widthscolspecs 直接指定列宽更安全(或者至少更明确)。

In [55]: pd.read_fwf(io.StringIO(original), header=None, widths=[17, 100])
Out[55]: 
                    0                    1
0         Origin Time  2016/04/16 01:25:00
1                Lat.               32.753
2               Long.              130.762
3         Depth. (km)                   12
4                Mag.                  7.3
5        Station Code               AIC001
6        Station Lat.              35.2976
7       Station Long.             136.7500
8   Station Height(m)                    6
9         Record Time  2016/04/16 01:28:06
10  Sampling Freq(Hz)                100Hz
11   Duration Time(s)                  120
12               Dir.                  N-S
13       Scale Factor    7845(gal)/8223790
14    Max. Acc. (gal)                2.327
15    Last Correction  2016/04/16 01:28:08

当然,如果您的文件格式不一致,您可能就没有那么幸运了,必须提供一些解决方法。

FWIW,这只是一个美化版

df = pd.DataFrame([[row[:17].strip(), row[17:].strip()] for row in original.splitlines()])

在这种情况下。

【讨论】:

  • 啊,谢谢! df = pd.read_fwf(io.StringIO(original), header=None) 成功了,唯一的缺点是我会将这个方法包含在一个循环中以迭代 500 多个文件。你认为有没有更好的方法来做到这一点而不求助于熊猫?
  • @Arosa822:呃,你在你的问题中说你正在创建熊猫数据帧,所以不,我认为你不能避免求助于熊猫。 ;-) 但是,如果您想在不使用 pandas 的情况下制作正确拆分的列表列表,只需使用我在上一段中传递的 to DataFrame 构造函数的 listcomp。那是纯 Python。
  • 谢谢,我会试试的。对不起,误导性的描述,这只是一个方法的子程序,最终将提取数据并附加到 DataFrame。
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多