Python熊猫:拆分并更改日期格式(一个带有eg:(2018年8月-2018年11月)),另一个只有一个?

Python熊猫:拆分并更改日期格式(一个带有eg:(2018年8月-2018年11月)),另一个只有一个?,python,pandas,Python,Pandas,拆分日期,例如2018年8月-->2018年8月1日 这是我的输入示例 id year_pass 1 Aug 2018 - Nov 2018 2 Jul 2017 这是我的示例输入2 id year_pass 1 Jul 2018 2 Aug 2017 - Nov 2018 我所做的, 我可以与eg(2018年8月-2018年11月)一起拆分日期 但我想不出如何做到这两个 输出应为: id y

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

这是我的输入示例

id      year_pass
1       Aug 2018 - Nov 2018
2       Jul 2017
这是我的示例输入2

id      year_pass
1                  Jul 2018
2       Aug 2017 - Nov 2018
我所做的, 我可以与eg(2018年8月-2018年11月)一起拆分日期

但我想不出如何做到这两个

输出应为:

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

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

Ex:

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
输出:

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

根据评论编辑:

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
输出:

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

如果需要在输出中使用不同的日期时间格式-
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
如果需要更改格式,则获取字符串,但所有datetimelike函数均失败:

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'>
df1=(df.pop('year_pass').str.split('\s+-\s+',expand=True)
.apply(lambda x:pd.to_datetime(x).dt.strftime(“%d-%m-%Y”))
.替换('NaT','')
df[['年开始','年结束]]=df1
打印(df)
id年份\u开始年份\u结束
0   1  01-08-2018  01-11-2018
1   2  01-07-2017      
打印(df.dtypes)
id int64
年份开始对象
年终目标
数据类型:对象
打印(类型(df.loc[0,'年份开始']))

您可以从按原始数据帧拆分字符串开始:

# split the original dataframe
df = df.year_pass.str.split(' - ', expand=True)

      0        1
id                  
1   Aug2018  Nov2018
2   Jul2017     None
然后将
pd.to_datetime
应用于将字符串转换为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

谢谢你的帮助!你能帮我解决编辑答案中的示例输入2吗更新答案..注意只有当值以空格开头时才有效…谢谢你的帮助!你能帮我完成编辑答案中的示例输入2吗谢谢你的帮助!你能帮我完成编辑中的示例输入2吗answer@showrya-那么您以后需要处理datetime列?因为问题是在输出数据中是否需要日期时间或字符串。@showrya-但如果需要字符串而不是
NaT
空字符串,则检查编辑后的答案。谢谢,只需要字符串