如何在 Python 中使用 Pandas 创建会计年度列?
How to use Pandas within Python to create a Fiscal Year Column?
我有一个带有 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"})
我应该如何有效地处理这个问题?只是我的语法把我搞砸了吗?还是我全错了?
[为了标题和通篇的清晰起见进行了编辑。]
如果您只关心这两个财年,您可以直接将您的日期与start/end日期进行比较:
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
来解决此问题)。
确保正确包含或不包含 start/end 日期(将 <
and/or >
更改为 <=
和 >=
,如有必要)。
好的,感谢 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
这才是真正为我过桥的东西Create a column based off a conditional with pandas.
编辑:忘记提及为 .dt 内容导入日期时间
我有一个带有 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"})
我应该如何有效地处理这个问题?只是我的语法把我搞砸了吗?还是我全错了?
[为了标题和通篇的清晰起见进行了编辑。]
如果您只关心这两个财年,您可以直接将您的日期与start/end日期进行比较:
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
来解决此问题)。
确保正确包含或不包含 start/end 日期(将 <
and/or >
更改为 <=
和 >=
,如有必要)。
好的,感谢 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
这才是真正为我过桥的东西Create a column based off a conditional with pandas.
编辑:忘记提及为 .dt 内容导入日期时间