我想将dataset中的三列合并为一列。我是这样的:
from datetime import date
data['DATE'] = data.apply(lambda x: date(int(x['Yr']), int(x['Mo']), int(x['Dy'])), axis=1)
然后我删除了这三列“ Yr”,“ Mo”,“ Dy”。 问题是我得到这样的东西:
DATE
0061-01-01
0061-01-02
0061-01-03
0061-01-04
0061-01-05
,我希望它是这样的:
DATE
1961-01-01
1961-01-02
1961-01-03
1961-01-04
1961-01-05
因此,在创建“日期”列之前,我不得不将两位数字的“年”列手动转换为四位数。
def yr_fx(df):
for i in range(len(df['Yr'])):
df['Yr'][i] = '19'+str(df['Yr'][i])`
我创建了上面的函数来为我完成这项工作,但问题是它花费的时间太长,无法像2-3分钟那样执行。它还显示此警告:
C:\Users\Abhishek\Anaconda3\lib\site-packages\ipykernel_launcher.py:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
This is separate from the ipykernel package so we can avoid doing imports until
(Screenshot)。
我想知道这样做的有效方法。
答案 0 :(得分:2)
IIUC,
df = pd.DataFrame({"Yr": 61, "Mo": 12, "Dy": 15}, index=[0])
df["Date"] = pd.to_datetime(
df["Yr"].astype(str) + "-" + df["Mo"].astype(str) + "-" + df["Dy"].astype(str)
)
df["Date"] = df["Date"] + pd.DateOffset(years=-100)
print(df)
Yr Mo Dy Date
0 61 12 15 1961-12-15
答案 1 :(得分:2)
另一种方法-如果pandas.to_datetime
是您的列名,那么我们可以利用assign
可以正确解释year
,month
和day
的事实。我们还将使用this page内联添加1900年。
df = pd.DataFrame({"Yr": 61, "Mo": 12, "Dy": 15}, index=[0])
pd.to_datetime(df[['Yr', 'Mo', 'Dy']]
.rename(columns={'Yr': 'year',
'Mo': 'month',
'Dy': 'day'})
.assign(year=lambda x: x['year']+1900))
[出]
0 1961-12-15
dtype: datetime64[ns]
答案 2 :(得分:0)
根据python datetime docs (https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)
您还应该能够使用小写的 y 来表示年份格式只有两位数。然后您可以使用 dt.strftime 和大写 y 重新格式化为四年日期。对于我的数据,它假定年份为 2000 年及以上,因此如果您的日期在 2000 年之前,则可能需要编写一个 lambda 函数。
data['DATE_reformatted'] = pd.to_datetime(data['DATE'], format="%y-%m-%d").dt.strftime("%Y-%m-%d")