我已经在熊猫中加载了2个数据通道:
DF1:
DF2:
它们都具有相同的年份/国家,但第一个具有mm / dd / yy格式的年份条目,而第二个仅具有年份。我需要合并它们,这不应该太难,但我不知道如何在第一个中重新格式化日期,因此它指定了年份而不是日期。 提前致谢
答案 0 :(得分:1)
看起来你需要明确拼接世纪(以避免被解析为20XX):
In [11]: df = pd.DataFrame([["12/31/50", "Argentina"], ["12/31/51", "Argentina"], ["12/31/52", "Argentina"]], columns=["Year", "Country"])
In [12]: df
Out[12]:
Year Country
0 12/31/50 Argentina
1 12/31/51 Argentina
2 12/31/52 Argentina
没有拼接:
In [13]: pd.to_datetime(df["Year"])
Out[13]:
0 2050-12-31
1 2051-12-31
2 2052-12-31
Name: Year, dtype: datetime64[ns]
In [14]: pd.to_datetime(df["Year"], format="%m/%d/%y")
Out[14]:
0 2050-12-31
1 2051-12-31
2 2052-12-31
Name: Year, dtype: datetime64[ns]
拼接:
In [15]: df["Year"].apply(lambda s: s[:-2] + "19" + s[-2:])
Out[15]:
0 12/31/1950
1 12/31/1951
2 12/31/1952
Name: Year, dtype: object
In [16]: pd.to_datetime(df["Year"].apply(lambda s: s[:-2] + "19" + s[-2:]), format="%m/%d/%Y")
Out[16]:
0 1950-12-31
1 1951-12-31
2 1952-12-31
Name: Year, dtype: datetime64[ns]
注意:您可以尝试在apply中进行解析(可能更高效)。
您可以从带有.dt访问者的日期时间系列中提取年份:
In [21]: df["Year"] = pd.to_datetime(df["Year"].apply(lambda s: s[:-2] + "19" + s[-2:]), format="%m/%d/%Y")
In [22]: df["Year"].dt.year
Out[22]:
0 1950
1 1951
2 1952
Name: Year, dtype: int64
答案 1 :(得分:1)
也许这可以用最少量的代码实现你想要的目标:
df['Year'] = pd.to_datetime(df['Year']).dt.year - 100
但请记住,将日期更改为'year'也会将列dtype更改为int
>>> df.dtypes
Year int64
Country object
dtype: object
答案 2 :(得分:0)
educ['Year'] = educ['Year'].year
应该在数据框中显示年份,如果不是,您可以使用to_datetime函数转换它们,如下所示:
educ['Year'] = [y - 100 for y in pd.to_datetime(edu['Year'], infer_datetime_format=True).year]