【问题标题】:Python: how to get the weekday from a CSV?Python:如何从 CSV 获取工作日?
【发布时间】:2016-03-11 07:33:02
【问题描述】:

我有一个包含各种列的 CSV 样本,我必须从给定的 date 列中提取工作日。示例如下:

Name,Birthdate,Age,Address
ABC,3-10-2016 11:00:00AM,21,XYZ Street 21 zone
BCD,3-11-2016 15:54:00PM,22,WXY Street 21/A, S zone
CDW,4-11-2015 21:09:00PM,22,ZYX Street 21Avenue, North Zone

我想读取 CSV 并提取日期以确定给定日期列的工作日

到目前为止,我已经创建了一个代码来读取 CSV 并获取工作日,但我无法在任何其他 CSV 上实现它。

代码如下:

import csv
from datetime import datetime as dt
with open('date.csv', 'r') as f:
  f.readline()

  for line in f:
    date = dt.strptime(line.strip(), '%m-%d-%Y %H:%M:%S').strftime('%A')
    print date

请帮助我,因为这是我学术研究的一部分。

注意:如果问题不清楚,请告诉我。 :)

【问题讨论】:

    标签: python csv datetime


    【解决方案1】:

    使用csv module 读取CSV 文件,然后解析一列。由于您有一个带有标题的文件,因此在这里使用DictReader() 方法是最简单的:

    import csv
    from datetime import datetime
    
    
    with open(filename, 'rb') as infile:
        reader = csv.DictReader(infile)
        for row in reader:
             birthdate = row['Birthdate']  # keys are named in the first row of your CSV
             birthdate = datetime.strptime(birthdate, '%m-%d-%Y %H:%M:%S')
             print birthdate.strftime('%A')
    

    【讨论】:

    • @desmond.carros:抱歉,不,我忘了在此处包含模块名称;这是csv 模块为您提供的一个类。
    • 如果我们需要创建一个新列并在该新列中添加所有天数怎么样?
    • @desmond.carros:不知道你在这里问什么。新问题最好作为新问题发布。
    • 很清楚:我想创建一个新列,并从您的代码中附加从print birthdate.strftime('%A') 返回的所有值。
    • @desmond.carros:只需在 row 字典中添加另一个键。 row['Weekday'] = birthdate.strftime('%A')。您可以使用 DictWriter() 对象将该行再次写入另一个文件。
    【解决方案2】:

    使用您导入的csv 库,如下所示:

    from datetime import datetime as dt        
    import csv
    
    with open('date.csv', 'rb') as f_input:
        csv_input = csv.reader(f_input)
        header = next(csv_input)
    
        for row in csv_input:
            print dt.strptime(row[1], '%m-%d-%Y %H:%M:%S%p').strftime('%A')
    

    这将打印:

    Thursday
    Friday
    Saturday           
    

    这会自动读取 csv 文件中的每一行作为单元格列表。因此,在这种情况下,您使用 row[1] 访问第二列并将其传递给您的 strptime 函数以获取星期几。

    【讨论】:

    • 这只是一个示例。原始数据可能在任何地方包含日期列。
    • 假设您可以使用相同的标头值识别位置,那么 DictReader 方法将是最好的。否则,您将需要使用正则表达式来尝试猜测数据在哪里。
    【解决方案3】:

    试试这个:

    import re
    from datetime import datetime as dt
    
    test_str = open('date.csv').read()
    p = re.compile(ur'\w+,(\d+-\d+-\d+\s\d+:\d+:\d+\w{2})')
    m = re.findall(p, test_str)
    for i in m:
        print dt.strptime(i, '%m-%d-%Y %H:%M:%S%p').strftime('%A')
    

    输入:

    Name,Birthdate,Age,Address
    ABC,3-10-2016 11:00:00AM,21,XYZ Street 21 zone
    BCD,3-11-2016 15:54:00PM,22,WXY Street 21/A, S zone
    CDW,4-11-2015 21:09:00PM,22,ZYX Street 21Avenue, North Zone
    

    输出:

    Thursday
    Friday
    Saturday
    

    【讨论】:

    • 正则表达式的好用。我会将此解决方案用于短代码。谢谢 Tim007 :)
    • 在我的原始数据中,我有几列日期,这个正则表达式将接收所有日期格式并返回所有日期的天数。有什么调整可以控制吗?
    • @desmond.carros 你能发布示例输入吗?
    • 示例:ID,ID_TYPE,OB_DATE,VERSION_NUM,MET_DOMAIN_NAME,OB_END_CTIME,OB_DAY_CNT,SRC_ID,REC_ST_IND,PRCP_AMT,OB_DAY_CNT_Q,PRCP_AMT_Q,METO_STMP_TIME,MIDAS_STMP_ETIME,PRCP_AMT_J 90, RAIN, 2006-01-01 00:00,1, WADRAIN,900,1,24109,1011,0,0,6, 2006-01-17 09:04,0,
    • 我想要两个日期的天数,但在单独的列中。我也想将这两个都附加到同一个 CSV 中
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多