【问题标题】:How to find earliest and latest dates from a CSV File [Python]如何从 CSV 文件中查找最早和最晚日期 [Python]
【发布时间】:2015-05-06 04:50:24
【问题描述】:

我的 CSV 文件的排列方式是有一行名为“日期”,在该行下方是包含一百万个日期的巨大列,采用传统格式,如“2015 年 4 月 22 日”和“2014 年 3 月 27 日” ”。

如何编写一个程序来识别 CSV 文件中最早和最晚的日期,同时保持原始格式(月/日/年)?

我试过了

for line in count_dates:
    dates = line.strip().split(sep="/")
    all_dates.append(dates)

print (all_dates)

我试过把“/”去掉,换成一个空格,但是什么都打印不出来。

【问题讨论】:

  • 发布您尝试过的代码。
  • 另外,请发布您的 csv 文件的代表性样本
  • 请注意,您所描述的日期格式是美国格式 - 月/日/年 - 英国和许多其他地方使用日/月/年,而计算机的“传统”格式是yearmonthday 或从特定日期开始的浮点数(不幸的是,并非所有操作系统都相同)。

标签: python csv


【解决方案1】:
import pandas as pd
import datetime
df = pd.read_csv('file_name.csv')
df['Dates'] = df['Dates'].apply(lambda v: datetime.datetime.strptime(v, '%m/%d/%Y'))
print df['Dates'].min(), df['Dates'].max()

【讨论】:

  • 将整个文件读入内存是个坏主意,因为它是一个大文件。
【解决方案2】:

考虑到您有一个大文件,将其全部读入内存是个坏主意。

逐行读取文件,手动跟踪最早和最晚日期。使用datetime.datetime.strptime将字符串转换为日期(以字符串格式为参数。

import datetime
with open("input.csv") as f:
  f.readline() # get the "Dates" header out of the way
  first = f.readline().strip()
  earliest = datetime.datetime.strptime(first, "%m/%d/%Y")
  latest = datetime.datetime.strptime(first, "%m/%d/%Y")
  for line in f:
    date = datetime.datetime.strptime(line.strip(), "%m/%d/%Y")
    if date < earliest: earliest = date
    if date > latest: latest = date
  print "Earliest date:", earliest
  print "Latest date:", latest

【讨论】:

    【解决方案3】:

    让我们打开 csv 文件,读出所有日期。然后使用strptime 将它们转换为可比较的日期时间对象(现在,我们可以使用max)。最后,让我们打印出最大(最新)的日期

    import csv
    from datetime import datetime as dt
    
    with open('path/to/file') as infile:
        dt.strftime(max(dt.strptime(row[0], "%m/%d/%Y") \
                        for row in csv.reader(infile)), \
                    "%m/%d/%Y")
    

    当然,您可以使用min 来获取最早的日期。但是,这需要两次线性运行,如果您愿意自己做一些繁重的工作,您可以只用一次:

    import csv
    from datetime import datetime as dt
    
    with open('path/to/file') as infile:
        reader = csv.reader(infile)
        date, *_rest = next(infile)
        date = dt.strptime(date, "%m/%d/%Y")
    
        for date, *_rest in reader:
            date = dt.strptime(date, "%m/%d/%Y")
            earliest = min(date, earliest)
            latest = max(date, latest)
        print("earliest:", dt.strftime(earliest, "%m/%d/%Y"))
        print("latest:", dt.strftime(latest, "%m/%d/%Y"))
    

    【讨论】:

    • 如何查看特定日期的工作日?
    • @desmond.carros: datetime.strftime 有一个格式化选项来输出工作日的名称
    【解决方案4】:

    一点 RTFM 答案:以 csv 格式打开文件(请参阅 csv 库),然后逐行迭代将作为日期的字段转换为日期对象(请参阅将字符串转换为日期对象),如果它小于最小值,则将其存储为最小值,类似于最大值,在第一行有一个特殊条件,即日期同时成为最小和最大日期。

    或者对于一些矫枉过正的事情,您可以使用 Pandas 将其读入数据框,将特定列指定为日期格式,然后使用 max & min。

    【讨论】:

    • FTRM = F*** 阅读材料?
    • 感谢 EvenLisle 纠正了我的 Acronymic Dyslexia - 我的借口是这里是 06:00 - 刚起床!
    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 2010-10-21
    • 2021-09-29
    • 2021-03-13
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多