如何在熊猫中将两位数的年份整数转换为四位数?

时间:2019-12-17 14:37:57

标签: python pandas dataframe datetime

我想将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)。

我想知道这样做的有效方法。

Dataset Description

3 个答案:

答案 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可以正确解释yearmonthday的事实。我们还将使用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")