首页 > 解决方案 > Pandas 数据框中的列,格式为 D/M/YY 到两个日期时间变量

问题描述

我目前在 pandas 中有一个名为 df 的astrology包含两列的列,一个名为birthdate 的列有日期,我想从中创建两个新的 DateTime 变量)一个变量来记录月份和日期,另一个变量来记录年份)。

我当前的 df 看起来像这样:

    birthdate   howMuch
       1/1/95   8
      3/15/80   7
      5/28/86   1
     11/16/61   5
     12/15/88   2

所需的df:

    month-day   year   howMuch
       1-1      1995    8
       3-15     1980    7
       5-28     1986    1
       11-16    1961    5
       12-15    1988    2

我尝试的当前代码是:

astrology['year'] =  pd.to_datetime(astrology['.birthdate'])

我得到了错误:

OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 7545-07-14 00:00:00

标签: pythonpandasdatetime

解决方案


首先是可能的测试清洁是否正确,检查是否某些无法解析的日期时间to_datetime和参数errors='coerce',因此未解析的日期时间是NaT,过滤的是Series.isnaboolean indexing

print (astrology[pd.to_datetime(astrology['birthdate'], errors='coerce').isna()])

然后转换为日期时间,使用月份和日期的格式Series.dt.strftime以及年份Series.dt.year,但必须减去100以避免解析高于今天年份的年份:

dates =  pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(monthday = dates.dt.strftime('%m/%d'),
                             year = y.mask(y > now, y - 100))
print (astrology)
  birthdate  howMuch monthday  year
0    1/1/95        8    01/01  1995
1   3/15/80        7    03/15  1980
2   5/28/86        1    05/28  1986
3  11/16/61        5    11/16  1961
4  12/15/88        2    12/15  1988

如果在此处Series.str.rsplit使用没有填充零的月日列,并通过索引选择第一个列表str[0]

md = astrology['birthdate'].str.rsplit('/', n=1).str[0]
dates =  pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(monthday = md,
                             year = y.mask(y > now, y - 100))
print (astrology)
  birthdate  howMuch monthday  year
0    1/1/95        8      1/1  1995
1   3/15/80        7     3/15  1980
2   5/28/86        1     5/28  1986
3  11/16/61        5    11/16  1961
4  12/15/88        2    12/15  1988

推荐阅读