【问题标题】:Extract rows from CSV based on column data根据列数据从 CSV 中提取行
【发布时间】:2021-06-22 18:48:32
【问题描述】:

我有一份在每个月初生成的 .csv 格式的报告。目前,该报告包含一系列带有分类数据的列;其中一列是“add_date”字段,其中包含“YYYY-mm-dd HH:MM:SS”格式的数据。

我的最终目标是解析此源 CSV,以便仅保留包含“add_date”单元格且日期为上个月的行。例如,如果脚本在 2021 年 2 月 1 日运行,则只有包含 2021 年 1 月的日期的行会保留在输出 CSV 文件中。

这是源 CSV 内容的示例:

Name,Data1,add_date
jasmine,stuff ,2021-01-26 17:29:46
ariel,things,2021-01-26 17:48:04
ursula,foo,2016-11-02 19:32:09
belle,bar,2016-01-21 18:47:33

这是我目前拥有的python脚本:

#!/usr/bin/env python3

import csv
filtered_rows = []

with open('test123.csv', newline='') as csvfile:
    rowreader = csv.reader(csvfile, delimiter=',')
    for row in rowreader:
        if row["2021-01"] in csvfile.add_date:
            filtered_rows.append(row) 
        print(filtered_rows)

我用以下命令调用:

./testscript.py > testfile.csv

目前,当我运行上述命令时,我收到以下错误消息:

Traceback (most recent call last):
  File "./testscript.py", line 9, in <module>
    if row["2021-01"] in csvfile.add_date:
TypeError: list indices must be integers or slices, not str

我当前的 Python 版本是 Python 3.6.4,在 CentOS Linux 版本 7.6.1810(核心)中运行。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    如果我没猜错,你可以这样做:

    import pandas as pd
    from datetime import datetime
    df= pd.read_csv('test.csv',sep=',',header=0)
    df['add_date']= pd.to_datetime(df['add_date'])
    filtered=df[(df.add_date >= datetime.strptime('2021-01-01','%Y-%m-%d')) & (df.add_date <= datetime.strptime('2021-01-31','%Y-%m-%d')) ]
    

    【讨论】:

    【解决方案2】:

    要正确执行此操作,您需要确定上个月年,然后将其与每行的add_date 字段进行比较。处理 12 月的年份很重要 → 一月(以及多年的可能性)过渡。

    这就是我的意思。

    import csv
    import datetime
    
    filename = 'test123.csv'
    ADD_DATE_COL = 2
    
    # Determine previous month and year.
    first = datetime.date.today().replace(day=1)
    last = first - datetime.timedelta(days=1)
    previous_month, previous_year = last.month, last.year
    
    # Extract rows for previous month.
    filtered_rows = []
    with open(filename, newline='') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        next(reader)  # Ignore  header row.
        for row in reader:
            add_date = datetime.datetime.strptime(row[ADD_DATE_COL], '%Y-%m-%d %H:%M:%S')
            if add_date.month == previous_month and add_date.year == previous_year:
                filtered_rows.append(row)
    
    print(filtered_rows)
    

    我从@bgporter 对问题How to determine date of the previous month? 的回答中大致了解了如何确定上个月的日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-04
      • 2017-06-26
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      相关资源
      最近更新 更多