首页 > 解决方案 > 用时间戳格式的变量替换熊猫数据帧上的年份

问题描述

df使用以下代码创建了以下内容:

df = pd.read_table('https://raw.githubusercontent.com/guipsamora/pandas_exercises/master/06_Stats/Wind_Stats/wind.data', sep = "\s+", parse_dates = [[0,1,2]]) 

如果我们运行以下命令:

type(df['Yr_Mo_Dy'][0])

我们将看到下面的观察['Yr_Mo_Dy']是有pandas._libs.tslibs.timestamps.Timestamp格式的。

我要做的是:每当我看到一年> = 2061(['Yr_Mo_Dy'])时,我想减去-100,否则我只保留年份并继续迭代。

我尝试了以下代码:

for i in list(range(df.shape[0])):
    # assign all the observations under df['Yr_Mo_Dy'] to ts
    ts = df['Yr_Mo_Dy'][i]

    if df['Yr_Mo_Dy'][i].year >=2061:
        # replace the year in ts by year - 100
        ts.replace(year=df['Yr_Mo_Dy'][i].year - 100)
    else:
        continue

但是循环什么也不做。我觉得这与变量赋值有关ts = df['Yr_Mo_Dy'][i]。但我想不出另一种方法来完成这项工作。

考虑到我在这篇文章中看到的答案,我试图在每次循环迭代后分配一个变量。

标签: pythonpython-3.xpandasdatetime

解决方案


您应该旨在避免可矢量化操作的手动循环。

在这种情况下,您可以使用numpy.where创建条件系列:

df = pd.DataFrame({'A': pd.to_datetime(['2018-01-01', '2080-11-30',
                                        '1955-04-05', '2075-10-09'])})

df['B'] = np.where(df['A'].dt.year >= 2061,
                   df['A'] - pd.DateOffset(years=100), df['A'])

print(df)

           A          B
0 2018-01-01 2018-01-01
1 2080-11-30 1980-11-30
2 1955-04-05 1955-04-05
3 2075-10-09 1975-10-09

推荐阅读