【问题标题】:Filter CSV by month and create new csv with that months data按月过滤 CSV 并使用该月数据创建新的 csv
【发布时间】:2016-09-08 13:50:29
【问题描述】:

每当“呼叫解决时间”列中出现新月份时,我都希望使用该月份和年份创建一个新的 csv 文件。并将包含该月份和年份的所有行过滤到该新 csv 中。

像这样:

alldata.csv

Call Resolve Time   Priority    Overall Result
8/6/2015                  P4    F
5/13/2015                 P4    F
4/28/2015                 P4    P
5/13/2015                 P4    F
5/27/2015                 P4    F

alldata.csv 创建的新文件 May-2015.csv 仅包含 2015 年 5 月 XX 日的数据

Call Resolve Time   Priority    Overall Result
    5/13/2015                 P4    F
    5/13/2015                 P4    F
    5/27/2015                 P4    F

到目前为止,我有这个,但我必须手动为每年和每月创建一些东西:

reader = csv.reader(open(r"alldata.csv"), delimiter=',') 
filtered = filter(lambda p: '5/27/15' == p[1], reader) 
csv.writer(open(r"May-2015.csv",'w'),delimiter=',').writerows(filtered)

编辑 ---------------------------------------------- -----------------------------

# say, reader is the reader object
# do next(reader) to skip the headings
import csv
from itertools import groupby

reader = csv.reader(open(r"alldata.csv"), delimiter=',')

def by_month (row):
    date = row[7] 
    month = int(date.split("/", 1)[0])
    return month

m_g = groupby(reader, by_month)

for month, group in m_g:
    group = list(group)
    # use a month to month_name map
    with open('{}.csv'.format(month), 'w') as fw:
        w = csv.writer(fw)
        w.writerows(group)

手动添加日期:

def by_month(row):
    date = '5/9/2016'
    month = int(date.split("/", 1)[0])
    return month

【问题讨论】:

    标签: python csv datetime filter


    【解决方案1】:

    试试下面的,

    # say, reader is the reader object
    # do next(reader) to skip the headings
    from itertools import groupby
    def by_month(row):
        date = row[0] 
        month = int(date.split("/", 1)[0])
        return month
    
    m_g = groupby(reader, by_month)
    
    for month, group in m_g:
        group = list(group)
        # use a month to month_name map
        with open('{}.csv'.format(month), 'w') as fw:
            w = csv.writer(fw)
            w.writerows(group)
    

    评论如果有什么不工作。

    【讨论】:

    • 谢谢,它给了我一个“IndexError: list index out of range”。我定义了阅读器并检查它是否从右行拉出。在line 16, in <module> group = list(group) line 9, in by_month date = row[7]
    • @C Panda 我缩短了工作表,实际上是在第 7 行。不知道这是否是改变的正确区域
    • @iOSSecure 在by_month 内打印row[7]。如果它像str 一样给出1/2/3,那么我的代码是正确的。我没想到会有IndexError。只需打印row。看看我是不是搞砸了。
    • @C Panda 我已经用你的代码和我所做的更改编辑了我的主要帖子。我认为这是读取该行的问题,因为当我将 by_month 中的 date 更改为 date = 5/9/2016 时,它创建了一个名为 5 的文件,其中包含 May 的数据。
    • @iOSSecure 制作类似{1: 'Jan',..} 的地图,或者更好地检查datetime 模块。我相信如果您利用datetimeby_month 函数将是一个单行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多