我正在尝试使用pandas.to_datetime将pandas数据框的列从字符串类型转换为datetime。 列的值具有以下格式:
Q1'17
其中“ Q”是季度,“ 17”是2017年。
该列中也有null值(我可以删除日期为空的整行)。
我试图解决这个问题,消除了季度,仅考虑年份,但是我无法以这种方式将16转换为2016:
df_cpu["Launch_Date"] = [str(x) for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = [x[3:5] for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = [int(x) for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = pd.to_datetime(df_cpu["Launch_Date"], format('%Y'))
即使这样也不行:
df_cpu["Launch_Date"] = pd.to_datetime(df_cpu["Launch_Date"], format('Q*\'%Y'))
因为出现此错误:
ValueError :(“未知字符串格式:”,“ Q3'16”)
我应该如何解决这个问题?
我希望有以下类型的输出:例如,如果值是“ Q1'16”,我希望有“ 01-01-2016”。
答案 0 :(得分:1)
您可以将字符串的第一部分map
设置为可以在to_datetime
中使用的值,例如:
df_cpu = pd.DataFrame({'Launch_Date':["Q1'17", "Q3'16"]})
dict_Q = {"Q1": '01-01-', "Q3": '07-01-'}
print (pd.to_datetime( df_cpu["Launch_Date"].str[:2].map(dict_Q) #replace Qx by a first of month
+ df_cpu["Launch_Date"].str[3:])) #get the year independtly
0 2017-01-01
1 2016-07-01
Name: Launch_Date, dtype: datetime64[ns]
不要忘记将Q2和Q4 int dict_Q
添加到您想要的正确值
答案 1 :(得分:1)
我不是日期时间格式转换的专家,但这是一个可行的解决方案。我不能说这是最有效的。我会编写一个函数,该函数以您喜欢的格式返回日期时间,并在数据框上使用'apply'方法。
请注意,下面的函数假定年份始终为20--,并且输出为字符串。根据需要更改输出数据类型。
def new_date(arr):
if isinstance(arr, str):
quarter = {'Q1':'01-01-', 'Q2':'04-01-', 'Q3':'07-01-', 'Q4':'10-01-'}
x, y = arr.split("'")[0], arr.split("'")[1]
x_new = quarter[x]
y_new = '20'+y
return x_new + y_new
else:
pass
df_cpu["Launch_Date"] = df_cpu["Launch_Date"].apply(new_date)
还要注意,“ is_instance”条件仅用于处理NaN值。如果使用pd.dropna(),则不需要。
答案 2 :(得分:1)
考虑:
1)提供的数据:
df_cpu = pd.DataFrame(["Q1'17","Q3'16"], columns=['Launch_Date'])
2)启动日期列的长度始终为5;
您可以使用pd.offsets.QuarterBegin()在一年的第一天添加季度:
>> pd.to_datetime(df_cpu.Launch_Date.str[3:5],format='%y') + np.multiply(pd.offsets.QuarterBegin(startingMonth=1), df_cpu.Launch_Date.str[1:2].values.astype(int)-1)
0 2017-01-01
1 2016-07-01
Name: Launch_Date, dtype: datetime64[ns]