【问题标题】:Python Extract Data from CSV filePython 从 CSV 文件中提取数据
【发布时间】:2022-06-11 01:52:29
【问题描述】:

假设我们下面有一个样本数据

我想使用 Python 和从第 5 行(即交易 ID、交易名称、起始日期、到期日期)到第 8 行的额外数据。此外,一旦我提取了数据,我想将文件保存为以下格式 ExtensionReport202205.csv 并且整个内容应该是动态的。我使用跳过行和 iloc 来获取行但它不是动态的?所以请多多指教。

[![在此处输入图片描述][2]][2]

我的实际表:

错误信息图片: [2]:https://i.stack.imgur.com/e8XNx.jpg

【问题讨论】:

  • 你能把你已经开发的代码包含进去吗?
  • 实际的输入文件是什么样的? CSV 或看起来与图像中所表示的内容类似的文本文件?或者这就是 DF 的样子,你想从那里得到帮助?
  • "将 pandas 导入为 pd df=pd.read_excel("C:\\Users\\punk\\Downloads\\sample.xlsx",skiprows=4) df2=df.iloc[0: ] " 使用此代码,我可以提取数据以及标题,但它不是动态的。上图是一个名为 sample 的 excel 文件,我想添加额外的数据以及标题并将文件保存为 csv 格式。我应该将文件保存为“Extension_Report202205

标签: python python-3.x pandas


【解决方案1】:

这可能对你有用。虽然如果您有其他要求,您可能需要进行调整。

阅读 XLSX:

xls = r'D:\jchtempnew\SO\so_fix.xlsx'
df = pd.read_excel(xls)
print(df)

              Unnamed: 0 Unnamed: 1           Unnamed: 2           Unnamed: 3
0                    NaN        NaN                  NaN                  NaN
1                    NaN        NaN                  NaN                  NaN
2    Run Date:2022/05/31        NaN                  NaN                  NaN
3  2022/05/01-2022/05/31        NaN                  NaN                  NaN
4                Deal ID  Deal Name     Origination Date        Maturity Date
5                    PEP       D251  2019-05-01 00:00:00  2023-03-13 00:00:00
6                     KO       D351  2020-10-02 00:00:00  2025-04-15 00:00:00
7                     MM       D451  2021-11-10 00:00:00  2026-12-01 00:00:00

查找并格式化运行日期文件名 - 处理 yyyy/mm/ddmm/dd/yyyy

if df['Unnamed: 0'].str.match('^Run Date:.*\d{4}/\d\d/\d\d').any():
    fdate = df['Unnamed: 0'].str.extract('^Run Date:(\d{4}/\d\d)/\d\d').dropna().iat[0,0].replace('/','')
    fn = f'ExtensionReport{fdate}.csv'
    
elif df['Unnamed: 0'].str.match('^Run Date:.*\d\d/\d\d/\d{4}').any():
    my = df['Unnamed: 0'].str.extract('^Run Date:.*(\d\d)/\d\d/(\d{4})').dropna()
    fn = f'ExtensionReport{my.iat[0,1]+my.iat[0,0]}.csv'

fn

'ExtensionReport202205.csv'

然后去掉标题上方的所有内容:

df2 = df.dropna()

然后提取标题并从中设置新的列名:

df2.columns = df2.iloc[0].values
df2 = df2.iloc[1:,:]

只保留处理交易。摆脱其他人 - 比如 In Queue:

if df2['Deal ID'].str.contains('Deal ID').any():
    df2 = df2.iloc[:df2['Deal ID'].str.contains('Deal ID').argmax()]
    
print(df2)

  Deal ID Deal Name     Origination Date        Maturity Date
5     PEP      D251  2019-05-01 00:00:00  2023-03-13 00:00:00
6      KO      D351  2020-10-02 00:00:00  2025-04-15 00:00:00
7      MM      D451  2021-11-10 00:00:00  2026-12-01 00:00:00

然后保存到您命名的 CSV:

df2.to_csv(fn, ...)

【讨论】:

  • 我犯了一个错误,现在我可以提取日期了。但是使用这段代码,我还得到了队列中的交易及其标题(见上图)?此外,如果日期格式为 05/31/2022,那么使用代码如何仅获取 202205?
  • @cmpunk 我更新了我的答案以满足您的新要求
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 2022-07-07
  • 2022-12-18
  • 2018-05-20
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多