1

我有一个带有 python 的代码,可以在将 .csv 附加到另一个数据集之前对其进行清理。它缺少几列,所以我一直试图弄清楚如何使用 Pandas 添加列并填充行。

我目前有一列DiscoveredDate,格式为 10/1/2017 12:49。

我想要做的是获取该列,并且日期范围 10/1/2016-10/1/2017 中的任何内容都有一列FedFY的行填充 2017 年,同样适用于 2018 年。

下面是我当前的脚本减去一些不同的列清理。

    import os
    import re
    import pandas as pd
    import Tkinter
    import numpy as np

    outpath = os.path.join(os.getcwd(), "CSV Altered")

    # TK asks user what file to assimilate
    from Tkinter import Tk
    from tkFileDialog import askopenfilename

    Tk().withdraw()
    filepath = askopenfilename() # show an "Open" dialog box and return the path to the selected file

    #Filepath is acknowledged and disseminated with the following totally human protocols
    filenames = os.path.basename(filepath)

    filename = [filenames]

    for f in filename:
    name = f
    df = pd.read_csv(f)

        # Make Longitude values negative if they aren't already.
        df['Longitude'] = - df['Longitude'].abs()

        # Add Federal Fiscal Year Field (FedFY)
        df['FedFY'] = df['DiscoveredDate']
        df['FedFY'] = df['FedFY'].replace({df['FedFY'].date_range(10/1/2016 1:00,10/1/2017 1:00): "2017",df['FedFY'].date_range(10/1/2017 1:00, 10/1/2018 1:00): "2018"})

我也试过这个,但我认为我完全是在捏造它。

 for rows in df['FedFY']:
    if rows = df['FedFY'].date_range(10/1/2016 1:00, 10/1/2017 1:00):
        then df['FedFY'] =  df['FedFY'].replace({rows : "2017"})
    elif df['FedFY'] =  df['FedFY'].replace({rows : "2018"})

我应该如何有效地解决这个问题?只是我的语法把我弄乱了吗?还是我全都错了?

[为清楚起见标题和通篇进行了编辑。]

4

2 回答 2

3

好的,感谢 DyZ,我正在取得进步;但是,我想出了一个更简单的方法来做到这一点,所有年份都是如此。

在他的 np.where 的基础上,我:

 From datetime import datetime

 df['Date'] = pd.to_datetime(df['DiscoveredDate'])
 df['CalendarYear'] = df['Date'].dt.year
 df['Month'] = df.Date.dt.month
 c = pd.to_numeric(df['CalendarYear'])

这是魔术线。

df['FedFY'] = np.where(df['Month'] >= 10, c+1, c) 

为了扫地,我添加了一行以将其从数字恢复为日期时间格式。

df['FedFY'] = (pd.to_datetime(df['FedFY'], format = '%Y')).dt.year

这对我来说真正跨越了桥梁创建一个基于熊猫条件的列。

编辑:忘记提及.dt 内容的导入日期时间

于 2018-03-26T21:14:06.000 回答
0

如果您只关心两个 FY,您可以将您的日期直接与开始/结束日期进行比较:

df["FedFY"] = np.where((df.DiscoveredDate < pd.to_datetime("10/1/2017")) &\
                       (df.DiscoveredDate > pd.to_datetime("10/1/2016")), 
                       2017, 2018)

2016 年 10 月 1 日之前的任何日期都将被错误标记!(您可以通过添加另一个来解决此问题np.where)。

确保正确包含或不包含开始/结束日期(如有必要,更改<和/或更改><=>=)。

于 2018-03-24T04:23:09.653 回答