繁体   English   中英

Python 问题使用 function 将列添加到 dataframe 我已定义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM