【问题标题】:How do you convert the two digit year integer to four digits in Pandas?如何将 Pandas 中的两位年份整数转换为四位数字?
【发布时间】:2019-12-17 14:37:57
【问题描述】:

我想将 [dataset][1] 中的三列合并为一列。我是这样做的:

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\abc\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

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

【问题讨论】:

  • 您的列是否采用以下格式 Yr = 61 Mo = 12 Dy=15 ?
  • Yr、Mo、Dy是列名,是的。
  • 请不要使用图片,请提供数据框的文本示例。阅读How to Askminimal reproducible example
  • @Datanovice 我一定会这样做的。
  • 试一试并编辑这个问题,我会修改我的反对票以支持赞成票,记住人们需要文本示例来在他们自己的环境中进行测试。祝你好运。

标签: python pandas dataframe datetime


【解决方案1】:

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

【讨论】:

  • 在使用“DateOffset”之前,如果我希望所有年份都在 1900 年代,因为我现在的年份在 61 到 78 之间。所以 61-68 年变成 2061-2068 年,其他年份在1900 年代,但如果我使用 pd.DateOffset(years=-100) 将 2061-2068 变为 1961-1968,那么其他年份现在都在 1800 年代。如何在保持其他年份不变的同时将 2061-2068 年转为 1961-1968 年?
  • 是的,这很简单,给我一点,我会为你编辑@Abhishek Panchal
【解决方案2】:

另一种方法 - 我们可以利用 pandas.to_datetime 可以正确解释 yearmonthday 的事实,如果它们是您的列名。我们还将使用assign 内联添加 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]

【讨论】:

  • 这更加灵活,并且减少了所有字符串连接的需要@OP使用这个答案。
  • @Datanovice 我实际上更喜欢您的解决方案,这就是我真正做到的方式!只是将其添加为一个有趣的小替代品
【解决方案3】:

根据 python 日期时间文档 (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")

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多