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

busg9geu  于 2022-12-25  发布在  Python
关注(0)|答案(5)|浏览(284)

我的CSV文件是这样排列的,有一行名为"日期",该行下面是一个巨大的列一百万个日期,在传统的格式像"4/22/2015"和"3/27/2014"。
我怎样才能编写一个程序来识别CSV文件中的最早和最晚日期,同时保持原始格式(月/日/年)?
我试过了

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

print (all_dates)

我试过去掉"/"并用空格替换它,但它没有打印任何内容。

mrwjdhj3

mrwjdhj31#

让我们打开csv文件,读出所有的日期,然后使用strptime将它们转换为可比较的datetime对象(现在,我们可以使用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"))
lg40wkob

lg40wkob2#

一点RTFM的回答:打开csv格式的文件(参见csv库),然后逐行迭代,将日期字段转换为日期对象(参见将字符串转换为日期对象的文档),如果到目前为止它小于minimum,则将其存储为minimum,类似于max,但在第一行有一个特殊条件,即日期同时成为最小和最大日期。
或者,为了避免麻烦,您可以使用Pandas将其读入一个 Dataframe ,将特定列指定为日期格式,然后使用max & min。

oewdyzsn

oewdyzsn3#

我认为用Pandas来做这个比较方便。

import pandas as pd

df = pd.read_csv('file_name.csv')
df['name_of_column_with_date'] = pd.to_datetime(df['name_of_column_with_date'], format='%-m/%d/%Y')

print('min_date{}'.format(min(df['name_of_column_with_date'])))
print('max_date{}'.format(max(df['name_of_column_with_date'])))

内置函数与Pandas Dataframes配合良好。
要进一步了解pd.to_datatime中的格式功能,可以使用Python strftime cheat sheet

pwuypxnk

pwuypxnk4#

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

wpcxdonn5#

考虑到您有一个大文件,将其整个读入内存是一个坏主意。
逐行读取文件,手动跟踪最早和最晚的日期。使用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

相关问题