Python Pandas:拆分并更改日期格式(一个带有例如:(2018年8月-2018年11月)),另一个只有一个



拆分日期,例如,2018年8月-->2018年1月8日??

这是我的样品输入

id      year_pass
1       Aug 2018 - Nov 2018
2       Jul 2017

这是我的样本输入2

id      year_pass
1                  Jul 2018
2       Aug 2017 - Nov 2018

我所做的,我可以在上拆分日期,例如:(2018年8月-2018年11月)

# splitting the date column on the '-'
year_start, year_end = df['year_pass'].str.split('-')
df.drop('year_pass', axis=1, inplace=True)
# assigning the split values to columns
df['year_start'] = year_start
df['year_end'] = year_end
# converting to datetime objects
df['year_start'] = pd.to_datetime(df['year_start'])
df['year_end'] = pd.to_datetime(df['year_end'])

但不知道如何为两个做到这一点

输出应为:

id      year_start    year_end
1       01-08-2018    01-11-2018
2       01-07-2018    

这是使用dt.strftime("%d-%m-%Y")的一种方法。

例如:

import pandas as pd
df = pd.DataFrame({"year_pass": ["Aug 2018 - Nov 2018", "Jul 2017"]})
df[["year_start", 'year_end']] = df["year_pass"].str.split(" - ", expand=True)
df["year_start"] = pd.to_datetime(df['year_start']).dt.strftime("%d-%m-%Y")
df["year_end"] =  pd.to_datetime(df['year_end']).dt.strftime("%d-%m-%Y")
df.drop('year_pass', axis=1, inplace=True)
print(df)

输出:

year_start    year_end
0  01-08-2018  01-11-2018
1  01-07-2017         NaT

根据注释编辑:

import pandas as pd
def replaceInitialSpace(val):
if val.startswith(" "):
return " - "+val.strip()
return val
df = pd.DataFrame({"year_pass": ["           Jul 2018", "Aug 2018 - Nov 2018", "Jul 2017           "]})
df["year_pass"] = df["year_pass"].apply(replaceInitialSpace) 
df[["year_start", 'year_end']] = df["year_pass"].str.split(" - ", expand=True)
df["year_start"] = pd.to_datetime(df['year_start']).dt.strftime("%d-%m-%Y")
df["year_end"] =  pd.to_datetime(df['year_end']).dt.strftime("%d-%m-%Y")
df.drop('year_pass', axis=1, inplace=True)
print(df)

输出:

year_start    year_end
0         NaT  01-07-2018
1  01-08-2018  01-11-2018
2  01-07-2017         NaT

您可以通过原始数据帧分割字符串开始:

# split the original dataframe
df = df.year_pass.str.split(' - ', expand=True)
0        1
id                  
1   Aug2018  Nov2018
2   Jul2017     None

然后应用pd.to_datetime将字符串转换为日期时间对象,并使用strftime:对其进行格式化

# rename the columns
df.columns = ['year_start','year_end']
df.apply(lambda x: pd.to_datetime(x, errors='coerce').dt.strftime('%d-%m-%Y'), axis=0)
year_start    year_end
id                        
1   01-08-2018  01-11-2018
2   01-07-2017         NaT

如果需要,输出中的日期时间需要不同的格式-YYYY-MM-DD:

df1 = df.pop('year_pass').str.split('s+-s+', expand=True).apply(pd.to_datetime)
df[['year_start','year_end']] = df1
print (df)
id year_start   year_end
0   1 2018-08-01 2018-11-01
1   2 2017-07-01        NaT
print (df.dtypes)
id                     int64
year_start    datetime64[ns]
year_end      datetime64[ns]
dtype: object

如果需要更改格式,则获取字符串,但所有类似日期时间的函数都失败了:

df1 = (df.pop('year_pass').str.split('s+-s+', expand=True)
.apply(lambda x: pd.to_datetime(x).dt.strftime('%d-%m-%Y'))
.replace('NaT',''))
df[['year_start','year_end']] = df1
print (df)
id  year_start    year_end
0   1  01-08-2018  01-11-2018
1   2  01-07-2017      
print (df.dtypes)
id             int64
year_start    object
year_end      object
dtype: object
print (type(df.loc[0, 'year_start']))
<class 'str'>

相关内容

  • 没有找到相关文章

最新更新