python将int转换为float的问题
我使用pandas read_csv提取数据并重新格式化。例如,“HBE日期”一栏中的“2018年10月28日”将重新格式化为“eHome 10/2018” 它主要起作用,但我得到了重新格式化的值,如“ehome 1.0/2015.0” 此时,如果我打印(键入(eMonth))它返回为“int”。如果我打印eYears列表,我会得到像2013、2014、2015等值 但是我将列表分配给数据框中的列python将int转换为float的问题,python,python-3.x,pandas,Python,Python 3.x,Pandas,我使用pandas read_csv提取数据并重新格式化。例如,“HBE日期”一栏中的“2018年10月28日”将重新格式化为“eHome 10/2018” 它主要起作用,但我得到了重新格式化的值,如“ehome 1.0/2015.0” 此时,如果我打印(键入(eMonth))它返回为“int”。如果我打印eYears列表,我会得到像2013、2014、2015等值 但是我将列表分配给数据框中的列 eHomeHBEdata.insert(0,'workshop Month',eMonths) e
eHomeHBEdata.insert(0,'workshop Month',eMonths)
eHomeHBEdata.insert(1,'workshop Year',eYears)
。之后,print(eHomeHBedata[‘车间月’])返回值,如2013.0、2014.0、2015.0。那是浮点数,对吗
当我尝试使用下面的代码时,我得到了上面提到的错误格式
eHomeHBEdata['course session'] = "ehome " + eHomeHBEdata['workshop Month'].astype(str) + "/" + eHomeHBEdata['workshop Year'].astype(str)
eHomeHBEdata['start'] = eHomeHBEdata['workshop Month'].astype(str) + "/1/" + eHomeHBEdata['workshop Year'].astype(str) + " 12:00 PM"
有人能解释一下这里发生了什么并帮我解决吗?解决方案
要将日期列转换(重新格式化)为MM/YYYY
,只需执行以下操作:
df[“您的列名称”].dt.strftime(“%m/%Y”)
有关两种不同的用例,请参见第A节和第B节
A.例子
我用一个名为:Date
的列为这个插图创建了一些虚拟数据。要将此列重新格式化为MM/YYYY
我使用的是df.Dates.dt.strftime(“%m/%Y”)
,它相当于df[“Dates”].dt.strftime(“%m/%Y”)
将熊猫作为pd导入
##虚拟数据
日期=pd.日期\u范围(开始日期为2020/07/01',结束日期为2020/07/07',频率为'D')
df=pd.DataFrame(日期,列=['dates']))
#解决方案
df['Reformatted_Dates']=df.Dates.dt.strftime(“%m/%Y”)
打印(df)
##输出:
#重新格式化的日期
# 0 2020-07-01 07/2020
# 1 2020-07-02 07/2020
# 2 2020-07-03 07/2020
# 3 2020-07-04 07/2020
# 4 2020-07-05 07/2020
# 5 2020-07-06 07/2020
# 6 2020-07-07 07/2020
B.如果您的输入数据采用以下格式
在本例中,首先可以使用列上的.astype('datetime64[ns,US/Eastern]')
转换日期。这使您可以对列应用特定于日期时间的方法。现在尝试运行df.Dates.astype('datetime64[ns,US/Eastern]')).dt.to_period(freq='M')
##虚拟数据
日期=[
'10/2018',
'11/2018',
'8/2019',
'5/2020',
]
df=pd.DataFrame(日期,列=['dates']))
打印(df.Dates.dtype)
打印(df)
##将列转换为datetime并重新格式化
df['Dates']=df.Dates.astype('datetime64[ns,美国/东部])#.dt.strftime('%m/%Y'))
打印(df.Dates.dtype)
C.避免使用for循环
试试这个。可以在列上使用熊猫的内置矢量化,而不是在每行上循环。我已经在列中使用了.dt.month
和.dt.year
来获取月份和年份,即int
eHomeHBEdata['HBE date']=pd.to_datetime(eHomeHBEdata['Course Completed'])
eHomeDates=eHomeHBEdata['HBE date']#应为datetime.datetime格式
##这就是我改变的
>>>eMonths=eHomeDates.dt.month
>>>eYears=eHomeDates.dt.年
eHomeHBEdata.插入(0,'车间月',月数)
eHomeHBEdata.插入(1,“车间年”,eYears)
使用此方法检查数据框pandas.dataframe.dtypes中每列的数据类型可能是float,如果插入int值,则会将其转换为float“workshop Month”is type series。创建它的eMonths对象是一个列表。进入列表的单个eMonth对象的类型为int。但是,当“车间月份”被放入df列时,它看起来像一个浮点。@NWWPA这能解决问题吗?如果您有任何问题,请告诉我。谢谢您的努力。您在A部分中的解决方案是解决其中一个问题,但不是全部问题。eHomeHBEdata“course session”值是固定的,但是eHomeHBEdata['start']仍然需要for循环提取的月份和日期数值。e、 g.输入日期为'11/5/2020'将为'start'创建输出值'11/1/2020'。原因与我将加载输出CSV的CRM软件有关。@NWWPA您能否将“输入数据”和“预期输出数据”作为示例共享?现在我还不清楚你到底在寻找什么。在上面的for循环之后,eMonths和eYears列表中的对象是int类型。在将它们分配到列之后,它们以某种方式转换为float类型:eHomeHBEdata.insert(0,'workshop Month',eMonths)eHomeHBEdata.insert(1,'workshop Year',eYears)
I获得“10.0”NWWPA请检查我的解决方案中的C部分,而不是“10”和“2020.0”而不是“2020”。
eHomeHBEdata['course session'] = "ehome " + eHomeHBEdata['workshop Month'].astype(str) + "/" + eHomeHBEdata['workshop Year'].astype(str)
eHomeHBEdata['start'] = eHomeHBEdata['workshop Month'].astype(str) + "/1/" + eHomeHBEdata['workshop Year'].astype(str) + " 12:00 PM"