从以空格分隔的字符串创建Pandas DataFrame。

9

I have a string:

              C1     C2                       DATE     C4     C5         C6      C7
0            0.0    W04  2021-01-08 00:00:00+00:00      E    EUE         C1     157
1            0.0    W04  2021-01-08 00:00:00+00:00      E    AEU         C1     157
2            0.0    W04  2021-01-01 00:00:00+00:00      E   SADA         H1     747
3            0.0    W04  2021-01-04 00:00:00+00:00      E   SSEA         H1     747
4            0.0    W04  2021-01-05 00:00:00+00:00      E   GPEA         H1     747

由于它来自一个Pandas DataFrame,所以它看起来很像一个DataFrame。我需要将其转换为Pandas DataFrame。

我尝试了以下操作:

pd.read_csv(StringIO(string_file),sep=r"\s+")

但是它会影响列,并将日期列分成两列。


6
使用 sep=r"\s\s+"。这个代码段需要将一个字符串按照至少两个空格的间隔符进行分割。 - Sayandip Dutta
@SayandipDutta 谢谢,它在正文上起作用,但标题仍然混乱。它看起来是右对齐的,而且只有一个空格分隔。 - Pedro Cintra
4
我复制了这些数据,尝试使用StringIOsep=r'\s\s+'来读取,但我无法重现你的问题。对我来说效果很好。 - Sayandip Dutta
1
pandas有read_fwf函数,可以指定列的断点,这似乎是您使用情况的解决方案。 - Eric Truett
1个回答

6

首先,重新创建该字符串:

s = """
              C1     C2                       DATE     C4     C5         C6      C7
0            0.0    W04  2021-01-08 00:00:00+00:00      E    EUE         C1     157
1            0.0    W04  2021-01-08 00:00:00+00:00      E    AEU         C1     157
2            0.0    W04  2021-01-01 00:00:00+00:00      E   SADA         H1     747
3            0.0    W04  2021-01-04 00:00:00+00:00      E   SSEA         H1     747
4            0.0    W04  2021-01-05 00:00:00+00:00      E   GPEA         H1     747
"""

现在,您可以使用 Pandas.read_csv 来导入缓冲区:
from io import StringIO
df = pd.read_csv(StringIO(s), sep=r"\s\s+")

据我所知,这会准确地得到你要找的DataFrame:
请注意将 DATE 列转换为 datetime 类型:

结果DataFrame的截图

df['DATE'] = df.DATE.astype('datetime64')

在遵循这种方法时需要考虑的一点是,如果列名比输入的数据要长,可能会遇到问题。在这种情况下,您可能需要在标题行中手动添加一些空格,以便列与数据正确对齐。 - mcsj120

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接