【问题标题】:Change Data Type of a Set of Entries in a Data Frame更改数据框中一组条目的数据类型
【发布时间】:2017-10-03 04:35:48
【问题描述】:

我已将一个包含 15 列和 100,000 多行的 csv 文件导入到数据框中。其中一列是“出生”,表示出生年份。在“birth”列中,实际上有 3 种不同的字符串类型格式,以“02-Aug-34”格式列出日期的格式,以“29DEC1899”格式列出日期的格式,最后是空白字符串格式“”。

我编写了一个脚本,可以对“出生”字符串的类型进行排序,然后将非空白字符串转换为给定日期的日期时间格式。我使用一个循环来遍历带有行号的适当列表,以将数据框“出生”条目从字符串替换为日期时间,基本上覆盖了以前的值。

浏览 100,000 多个条目大约需要 130 秒。考虑到输入值的 3 种不同可能情况,是否有更有效的方法转换数据类型?这个完成时间(130 秒)合理吗?

我对使用 pandas 很陌生。

【问题讨论】:

  • 可能02-Aug-15 有时是2015 有时是1915 吗?
  • @jezrael 不,日期都在 2000 年之前。

标签: python pandas type-conversion


【解决方案1】:

您可以为每种格式使用两次to_datetime,然后使用combine_first

另外02-Aug-15有时也不能是02-Aug-181502-Aug-191502-Aug-2015,因为无法区分。

df = pd.DataFrame({'date':['02-Aug-34','29DEC1899','02-Aug-15','']})

#format 29DEC1899
d1 = pd.to_datetime(df['date'], format='%d%b%Y', errors='coerce')

#replace last - to 19
dates = df['date'].str.replace(r'(.*)-', r'\1-19')
#alternative1
#dates = df['date'].str[::-1].str.replace('-', '91-', n=1).str[::-1]
#alternative2
#dates = df['date'].str.rsplit('-', n=1).str.join('-19')

#format 02-Aug-34
d2 =  pd.to_datetime(dates, format='%d-%b-%Y', errors='coerce')

#combine formats
d = d1.combine_first(d2)
print (d)
0   1934-08-02
1   1899-12-29
2   1915-08-02
3          NaT
Name: date, dtype: datetime64[ns]

【讨论】:

    【解决方案2】:

    使用 to_datetime:

    http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.to_datetime.html

    # Can be the same 'Date' column or different
    df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
    

    你也可以用“format='%d-%m-%Y'”来指定日期格式,例如

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 2021-07-31
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多