我的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)
我试图取走“/”并用空格替换它,但它不会打印任何内容。
答案 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"))