我有一个熊猫的数据框架,在这个格式的"2016-05-03“中有一列关于日期的专栏,这些是字符串。我需要将它们转换为字符串中的int,并在连字符(‘-’)处拆分,并且只提取一年。
这就是我试图将字符串转换为整数的地方:
tyc.startDate = tyc.startDate.astype(np.int64) 但它正在返回并出错:
ValueError: int()的文字无效,基数为10:'2015-06-01‘
这就是我为分裂所做的
tyc.startDate.str.split('-')[0]和
tyc.startDate.str.split('-', [0]) 但是这也不起作用,它分割并返回该列中所有行的列表:'2015','06','01‘,我只想拆分一年!
我确信有一种简单的方法,只需在0位置转换为int并拆分for ('-'),然后将其作为一个新列放到df中,请帮助!
发布于 2017-08-10 13:09:42
我相信您的数据包含NaN或一些非datetime值:
tyc = pd.DataFrame({'startDate':['2016-05-03','2017-05-03', np.nan],
'col':[1,2,3]})
print (tyc)
col startDate
0 1 2016-05-03
1 2 2017-05-03
2 3 NaN首先使用str[0]返回每一行的第一个列表值。但是也有问题--一些NaNs无法转换为int (be设计)--因此输出是浮动的:
print (tyc.startDate.str.split('-').str[0].astype(float))
0 2016.0
1 2017.0
2 NaN
Name: startDate, dtype: float64另一种解决方案是通过to_datetime转换为日期时间,并通过year解析年份。
print (pd.to_datetime(tyc.startDate, errors='coerce'))
0 2016-05-03
1 2017-05-03
2 NaT
Name: startDate, dtype: datetime64[ns]
print (pd.to_datetime(tyc.startDate, errors='coerce').dt.year)
0 2016.0
1 2017.0
2 NaN
Name: startDate, dtype: float64删除NaN的解决方案:
tyc['year'] = pd.to_datetime(tyc.startDate, errors='coerce').dt.year
print (tyc)
col startDate year
0 1 2016-05-03 2016.0
1 2 2017-05-03 2017.0
2 3 NaN NaN1.
通过NaNs通过dropna删除所有行,然后强制转换为int:
tyc = tyc.dropna(subset=['year'])
tyc['year'] = tyc['year'].astype(int)
print (tyc)
col startDate year
0 1 2016-05-03 2016
1 2 2017-05-03 20172.
将NaN替换为诸如1这样的int值,替换为fillna,然后转换为int
tyc['year'] = tyc['year'].fillna(1).astype(int)
print (tyc)
col startDate year
0 1 2016-05-03 2016
1 2 2017-05-03 2017
2 3 NaN 1发布于 2017-08-10 11:45:10
您可以使用应用
def mod_strings(date_str):
try:
return int(date_str.split('-')[0])
except (AttributeError, IndexError): # in case value is not as
# expected returning original value
return date_str
tyc.startDate = tyc.startDate.apply(mod_strings)但是,简单地将整个列从字符串转换为date对象,然后使用tyc.startDate = tyc.startDate.dt.year (假设熊猫版本为>= 0.16),可能更容易一些。
https://stackoverflow.com/questions/45612770
复制相似问题