如何从CSV文件中找到最早和最晚的日期[Python]

时间:2015-05-06 04:50:25

标签: python csv

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

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

我试过

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

print (all_dates)

我试图取走“/”并用空格替换它,但它不会打印任何内容。

4 个答案:

答案 0 :(得分:0)

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

或者对于某些过度杀手,您可以使用Pandas将其读入指定特定列作为日期格式的数据框中,然后使用max& amp;分钟。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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()

答案 3 :(得分:0)

让我们打开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"))