[英]Python issue adding a column to a dataframe using a function I have defined
我对 Python 真的很陌生(圣诞节前什么都不知道),我是自学的,并且在数据帧方面遇到了一些问题。
我正在使用 Z251D2CEBBFE9303B95E4AZ5669 将 CSV 中的数据导入 Python 中的 dataframe 中。 该数据有一个名为“ItemTime”的 DateTime 字段。 我需要做的是将 ItemTime 拆分为“Date”和“TimeSlot”,并将它们作为列添加到 dataframe 中,这样我就可以按 Date 和 TimeSlot(以及其他内容)进行汇总。 TimeSlot 是 ItemTime 适合的 15 分钟时隙。因此,如果 DateTime = 2020-10-14T11:34:00.767 我需要一个新的 Date 列来包含“2020-10-14”,以及一个新的 TimeSlot 列来包含“11 :30:00 - 11:45:00”。
我创建了一个 function,它使用两个输入(小时和分钟)生成这个 TimeSlot 值(my_TimeSlot)。
我已经设法让 Date 列正常工作,但 TimeSlot 出现问题。 我还在 dataframe 中添加了我的 function 所需的小时和分钟字段,因为我无法让它在一个 Z34D1F91FB2E514B8576ZZC1A75A89A 中工作,但仍然没有任何喜悦。
这就是我所拥有的给我日期、小时和分钟字段的东西:
detail = pd.read_csv(<the filename>, usecols=['SiteID', 'TransactionID', 'ItemTime', 'TotalGross', 'TotalNet' ])
fnDate = lambda row: datetime.datetime.date(datetime.datetime.strptime(row.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S'))
detail['Date'] = detail.apply(fnDate, axis=1)
fnHour = lambda row: datetime.datetime.strptime(row.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S').hour
detail['Hour'] = detail.apply(fnHour, axis=1)
fnMinute = lambda row: datetime.datetime.strptime(row.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S').minute
detail['Minute'] = detail.apply(fnMinute, axis=1)
这是我的 TimeSlot function 在独立运行时也可以工作
def my_TimeSlot(fhour,fminute):
if fminute >= 45:
smin = '45'
emin = '00'
elif fminute >= 30 :
smin = '30'
emin = '45'
elif fminute >= 15 :
smin = '15'
emin = '30'
else :
smin = '00'
emin = '15'
shour = str(fhour)
if emin == '00' :
ehour = str(fhour+1)
else :
ehour = str(fhour)
starttimeslot = shour+':'+smin+':00'
endtimeslot = ehour+':'+emin+':00'
return (starttimeslot+' - '+endtimeslot)
当我在向 dataframe 添加列的过程中尝试使用此 function 时,问题就出现了。
我在下面尝试了这两个命令,但它返回相同的错误 - “NameError:名称'my_TimeSlot'未定义”。
1
detail['TimeSlot'] = detail.apply(my_TimeSlot(Hour, Minute), axis=1)
2
fnTS = lambda row: my_TimeSlot(row.Hour, row.Minute)
detail['TimeSlot'] = detail.apply(fnTS, axis=1)
我什至尝试在不需要创建额外的小时和分钟列的情况下这样做
detail['TimeSlot'] = my_TimeSlot(datetime.datetime.strptime(detail.ItemTime[0:19],'%Y-%m-%dT%H:%M:%S').hour,
datetime.datetime.strptime(detail.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S').minute)
...但我仍然收到相同的错误消息。
定义的 function my_TimeSlot 保存在与主程序相同的 .py 文件中,所以我有点不知道为什么它无法识别它。 我尝试将它定位在文件的顶部和底部,但没有区别。
我已经搜索了 web 但我没有发现任何描述用户定义的 function 的问题,只有“简单”的功能,比如将两个数字加在一起。
任何帮助将不胜感激,因为这是我的头脑。
自从我使用 pandas 以来已经有一段时间了,据说它看起来不像您将细节转换为数据框,因此您不会拥有数据框的所有功能。
你有没有尝试过
detail = pd.read_csv(<the filename>, usecols=['SiteID', 'TransactionID', 'ItemTime', 'TotalGross', 'TotalNet' ]).DataFrame()
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html
这对我有用。
不过,可能有一种更有效的方法来做你想做的事情 - 例如提取时间,将其向下舍入到最接近的 15 分钟间隔,然后从那里开始 go。
detail['TimeSlot'] = detail.apply(lambda row: my_TimeSlot(row['Hour'], row['Minute']), axis=1)
from datetime import datetime
import pandas as pd
def my_TimeSlot(fhour,fminute):
if fminute >= 45:
smin = '45'
emin = '00'
elif fminute >= 30:
smin = '30'
emin = '45'
elif fminute >= 15:
smin = '15'
emin = '30'
else :
smin = '00'
emin = '15'
shour = str(fhour)
if emin == '00' :
ehour = str(fhour+1)
else :
ehour = str(fhour)
starttimeslot = shour+':'+smin+':00'
endtimeslot = ehour+':'+emin+':00'
return (starttimeslot+' - '+endtimeslot)
detail = pd.read_csv('test.csv', usecols=['SiteID', 'TransactionID', 'ItemTime', 'TotalGross', 'TotalNet' ])
fnDate = lambda row: datetime.date(datetime.strptime(row.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S'))
detail['Date'] = detail.apply(fnDate, axis=1)
fnHour = lambda row: datetime.strptime(row.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S').hour
detail['Hour'] = detail.apply(fnHour, axis=1)
fnMinute = lambda row: datetime.strptime(row.ItemTime[0:19], '%Y-%m-%dT%H:%M:%S').minute
detail['Minute'] = detail.apply(fnMinute, axis=1)
detail['TimeSlot'] = detail.apply(lambda row: my_TimeSlot(row['Hour'], row['Minute']), axis=1)
print(detail)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.