【问题标题】:issue in converting a dtype('O')to date format将 dtype('O') 转换为日期格式的问题
【发布时间】:2021-05-02 08:02:42
【问题描述】:

嗨,我在原始数据集中有日期(在列名下:'earliest_cr_line'),但是当我在 Jupyter 上检查 dtype 时,它​​是 dtype('O'),我使用以下代码转换为日期时间格式在以下代码中:

pd.to_datetime(final_3['earliest_cr_line'], format='%m/%d/%Y')

但此代码将错误显示为 ValueError: time data 'Jan-85' does not match format '%m/%Y' (match)

如何将整个列转换为日期格式,然后创建另一个列,以查看该日期与 2015 年 6 月 30 日之间的月份差异

【问题讨论】:

  • 您能提供部分数据吗?类似df.head(5) 的问题
  • id 1077501 Jan-85 1077430 Apr-99 1077175 Nov-01 1076863 Feb-96 1075358 Jan-96 名称:early_cr_line,dtype:object

标签: python pandas date format


【解决方案1】:

如果所有日期时间的格式为 MMM-YY 并且 MMM 是月份名称的前 3 个字母,则使用:

print (final_3)
        id earliest_cr_line
0  1077501           Jan-85
1  1077430           Apr-99
2  1077175           Nov-01
3  1076863           Feb-96
4  1075358           Jan-96

final_3['earliest_cr_line'] = pd.to_datetime(final_3['earliest_cr_line'], format='%b-%y')

final_3['diff'] = (pd.to_datetime('2015-06-30') - final_3['earliest_cr_line']).dt.days
print (final_3)
     id earliest_cr_line   diff
0  1077501       1985-01-01  11137
1  1077430       1999-04-01   5934
2  1077175       2001-11-01   4989
3  1076863       1996-02-01   7089
4  1075358       1996-01-01   7120

编辑:你可以减去 100 年,这里使用的是year > 2021

print (final_3)
        id earliest_cr_line
0  1077501           Jan-63
1  1077430           Apr-99
2  1077175           Nov-01
3  1076863           Feb-96
4  1075358           Jan-96

final_3['earliest_cr_line'] = pd.to_datetime(final_3['earliest_cr_line'], format='%b-%y')

mask = final_3['earliest_cr_line'].dt.year > 2021
h = pd.DateOffset(years=100)
final_3.loc[mask, 'earliest_cr_line'] = final_3['earliest_cr_line'] - h

final_3['diff'] = (pd.to_datetime('2015-06-30') - final_3['earliest_cr_line']).dt.days

print (final_3)
        id earliest_cr_line   diff
0  1077501       1963-01-01  19173
1  1077430       1999-04-01   5934
2  1077175       2001-11-01   4989
3  1076863       1996-02-01   7089
4  1075358       1996-01-01   7120

【讨论】:

  • 这显示了一个时间错误:TypeError: unsupported operand type(s) for -: 'Timestamp' and 'str'
  • @DipojjalSaha - 那么你在final_3['earliest_cr_line'] = pd.to_datetime(final_3['earliest_cr_line'], format='%b-%y') 中分配回final_3['earliest_cr_line'] = 吗?
  • 是:final_3['earliest_cr_line'] = pd.to_datetime(final_3['earliest_cr_line'], format='%b-%y') final_3['diff'] = (pd.to_datetime( '2015-06-30') - final_3['earliest_cr_line']).dt.days
  • @DipojjalSaha - 编辑后的答案,对我来说工作得很好。
  • 在转换日期时似乎存在问题,例如 01-01-1963 它读取为 01-01-2063。这发生在 1969 年之前的所有日期。有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多