从csv列打印最旧和最新的日期 - 按日期排序csv

时间:2017-10-19 08:35:18

标签: python pandas csv sorting date

更新的问题

我正在尝试使用Python(最好是Pandas)对csv的两个日期列中的日期进行排序。对于第一个,我希望得到最早的日期。对于第二个,我想得到最新的一个。

我的静态列表代码运行正常:

timestamps = ['08/04/2017', '08/09/2017', '08/03/2017']
sortedDates = timestamps.sort(key=lambda x: time.mktime(time.strptime(x,"%m/%d/%Y")))

01)首先我加载数​​据

for row in csv.reader(open('myFile.csv')):
  if row[4] == '56886':
    key = row[4] #key = (row[4], row[33][:4], row[4])
    startDate = row[19]

xxxxx[key] = xxxxx.setdefault(key, 0) + float(row[33])

02)然后我尝试对开始日期进行排序

df = pandas.read_csv('Bionic.csv', parse_dates=['Start Date'])
df2 = df.dropna(subset=["Start Date"])
df2['Start Date'].apply(lambda x: time.mktime(time.strptime(x,"%m/%d/%Y")))
print(df2)

我收到此错误:

  

sys:1:DtypeWarning:列(10,51,60,68,74)具有混合类型。   在导入时指定dtype选项或设置low_memory = False。

03)然后我尝试了这个:

df = pandas.read_csv('myFile.csv', parse_dates=['Start Date'])
df = df.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)

我收到同样的错误。

04)当我尝试这个时,我得到了"无"值,因为此列有空字段:

   startDate = startDate.split()
    minStartDate = startDate.sort(key=lambda x: time.mktime(time.strptime(x,"%m/%d/%Y")))
    print(minStartDate)

2 个答案:

答案 0 :(得分:2)

使用to_datetime

df['Start Date'] = pd.to_datetime(df['Start Date'])

如果上述行不起作用:

df['Start Date'] = pd.to_datetime(df['Start Date'], errors='coerce')

另一个解决方案是使用参数parse_dates

df = pandas.read_csv('myFile.csv', parse_dates=['Start Date'])

编辑:

您可以使用:

df = pd.read_csv('Bionic.csv', 
                 parse_dates=['Start Date', 'End Date'], #columns to datetimes
                 usecols=['Start Date', 'End Date']) #filter columns only
print (df.head())
  Start Date End Date
0        NaT      NaT
1        NaT      NaT
2        NaT      NaT
3        NaT      NaT
4        NaT      NaT

#get oldiest date
a = df['Start Date'].min()
print (a)
2001-10-24 00:00:00

#get most recent date
b = df['End Date'].max()
print (b)
2018-08-27 00:00:00

答案 1 :(得分:1)

您的数据框列中必须有nan。数据框中的nan是浮点类型。

您需要处理所有这些nan值。

一旦你处理完所有的nan值,你就可以使用你的第二段代码,它应该可以正常工作。