【问题标题】:Print the the oldest and newest date from a csv column - Sort csv by date从 csv 列打印最旧和最新的日期 - 按日期排序 csv
【发布时间】:2018-03-31 05:56:24
【问题描述】:

更新问题

我正在尝试使用 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)

【问题讨论】:

  • 在此处粘贴您的 CSV 数据。要么是你的数据有问题,要么是你加载它的方式有问题。
  • 您的数据框列中必须有一个nan。数据框中的nan 是float 类型。

标签: python pandas csv sorting date


【解决方案1】:

使用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

【讨论】:

  • 不,因为TypeError: strptime() argument 1 must be str, not float 表示他们的数据有问题。
  • to_datetime 将处理nan 类型,返回类型为pandas._libs.tslib.NaTType
  • @cᴏʟᴅsᴘᴇᴇᴅ - 没有数据很难知道,我尽最大努力在没有数据的情况下......
  • (Psst...也许在发布答案之前等待澄清;-))或者只是投票关闭。
  • @jezrael 我删除了不需要的列。我会说这是保密的,因为我这样做是因为我想学习 :) 我会再次检查您的答案。
【解决方案2】:

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

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

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

【讨论】:

  • 我的列中有空字段。他们中的大多数都有日期,但不是全部。当我尝试问题中的最后一个脚本时,我得到了“无”值。我该如何跳过它?使用 if 语句?
  • 因此,当通过df.read_csv() 加载时,列中的所有空字段都会变为nan。然后,您可以简单地使用 df2 = df.dropna(subset=["Start Date"]) 仅删除“开始日期”列的所有 nan 值。现在您可以使用上面的代码df2['Start Date'].apply(lambda x: time.mktime(time.strptime(x,"%m/%d/%Y"))
  • 对于空值,您还可以执行此df = df.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x),它将所有空值转换为nan,然后继续我的解决方案。虽然我更喜欢@jezrael 的解决方案。
  • 我不知道应该如何应用。我已经更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2014-07-06
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多