python - 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
解决方案
首先是可能的测试清洁是否正确,检查是否某些无法解析的日期时间to_datetime
和参数errors='coerce'
,因此未解析的日期时间是NaT
,过滤的是Series.isna
和boolean 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
推荐阅读
- java - 如何让 hibernate-ogm 在 jboss eap 7.2 上工作?
- angular - Angular“解析 http://localhost:8000/excel 期间的 Http 失败”
- python - 为两个给定的百分位值拟合对数范数分布
- mongodb - 如何将所有数据从一个 Mongodb 云项目复制到另一个?
- vim - 如何在 VIM 中为自定义文件类型创建自定义配色方案
- ssl - 如何使letscrypt与cloudflare一起使用?
- python - Python 第二次如何更快地读取这个二进制文件?
- oracle - Oracle FOR ALL 更新不适用于随机分区(在 SAS 4gl 中)
- debugging - 退出 intellij 中的当前调试
- sql - 在 CASE 语句中为变量设置值