Python 如何获得熊猫中时间戳之间的平均天数?

Python 如何获得熊猫中时间戳之间的平均天数?,python,pandas,datetime,data-science,Python,Pandas,Datetime,Data Science,我有客户发票之间带有时间戳的交易数据。我试图计算两张唯一发票之间的平均天数(通过“ServicedOn”)。其中有两个注意事项: 一个唯一的发票可以有多个具有不同时间戳的行(因为它们可能在不同的时间提供服务) 时间戳也有时间值,所以我无法使用diff()方法来计算增量天数 数据帧的外观如下所示: InvoiceNo SoldOn ServicedOn ItemType ItemCode GuestId FinalSalePrice FirstVisit Package

我有客户发票之间带有时间戳的交易数据。我试图计算两张唯一发票之间的平均天数(通过“ServicedOn”)。其中有两个注意事项:

  • 一个唯一的发票可以有多个具有不同时间戳的行(因为它们可能在不同的时间提供服务)
  • 时间戳也有时间值,所以我无法使用diff()方法来计算增量天数
数据帧的外观如下所示:

InvoiceNo SoldOn    ServicedOn  ItemType    ItemCode    GuestId FinalSalePrice  FirstVisit  Package BUName  SalePrice   Merchant_id
21312   4/26/2015 12:55:12 PM   4/26/2015 8:00:00 AM    0   SER-310-008 5a531810-9413-4091-acd5-424d125b0c9e    3089.9  No  No Package  Spa 2500    POW
31639   1153    6/12/2015 7:11:22 PM    6/12/2015 6:15:00 PM    0   SER-1257-008    5a531810-9413-4091-acd5-424d125b0c9e    5700.0  No  No Package  Spa 5000    POW
42492   73  5/15/2015 8:05:50 PM    5/15/2015 8:05:50 PM    2   ITM-3407-001    5a531810-9413-4091-acd5-424d125b0c9e    1600.0  No  No Package  Default 1422    POW
42493   73  5/15/2015 8:06:08 PM    5/15/2015 8:06:08 PM    2   ITM-3175-001    5a531810-9413-4091-acd5-424d125b0c9e    2750.0  No  No Package  Default 2444    POW
42494   73  5/15/2015 8:05:38 PM    5/15/2015 8:05:38 PM    2   ITM-4340-001    5a531810-9413-4091-acd5-424d125b0c9e    575.0   No  No Package  Default 511 POW

我不确定如何进行,因此请提供任何指导

对所有发票编号执行您想要的操作非常简单。如果您正在进行的是第一个服务,则可以排序,然后使用
groupby
head
获取每个发票编号的第一个日期,然后选择列并计算平均差:

mean_difference = (df.sort_values(by='ServicedOn')  # Get everything in date order
                     .groupby('InvoiceNo')  # group by invoice
                     .head(1)  # take first of each group
                     .ServicedOn  # only look at ServicedOn value
                     .diff()  # take differences
                     .mean())  # calculate mean

要在所有发票号码上做您想要做的事情非常简单。如果您正在进行的是第一个服务,则可以排序,然后使用
groupby
head
获取每个发票编号的第一个日期,然后选择列并计算平均差:

mean_difference = (df.sort_values(by='ServicedOn')  # Get everything in date order
                     .groupby('InvoiceNo')  # group by invoice
                     .head(1)  # take first of each group
                     .ServicedOn  # only look at ServicedOn value
                     .diff()  # take differences
                     .mean())  # calculate mean

为了澄清您的问题,请提供您认为在考虑样本数据的情况下,结果应该是什么。理想情况下,对于每个唯一的发票,我会查看第一个服务时间戳,并计算到下一个发票号的第一个服务时间戳之前的天数。例如:对于第21312号发票,我会查看第一个服务时间戳(4/26/2015)并计算第31639号发票首次服务日期(2015年12月6日)。为了澄清您的问题,请提供您认为应考虑样本数据的结果。理想情况下,对于每个独特的发票,我会查看第一次服务的时间戳,并计算到下一张发票的第一次服务日期。例如:在第21312号发票上,我会查看第一次服务日期(2015年4月26日),并计算到第31639号发票的第一次服务日期(2015年6月12日)。一个大问题是pandas没有计算ServicedOn列的差异,并抛出不支持的操作数错误“str”。这意味着您的ServicedOn列没有被解析为datetime。当我输入事务数据时,我是否应将服务列设为datetime列?谢谢你有两个选择。如果您正在从CSV文件读取此数据,则可以使用
parse_dates
选项来
read_CSV
在读取日期时对其进行解析。如果出于某种原因将其转换为另一种形式,可以使用
df.ServicedOn=pandas.to_datetime(df.ServicedOn)
重新解析该列,一个大问题是pandas没有计算ServicedOn列的差异,并抛出不支持的操作数错误“str”。这意味着您的ServicedOn列未被解析为datetime。当我输入事务数据时,是否应将ServicedOn列专用于datetime列?谢谢你有两个选择。如果您正在从CSV文件读取此数据,则可以使用
parse_dates
选项来
read_CSV
在读取日期时对其进行解析。如果出于某种原因以另一种形式出现,可以使用
df.ServicedOn=pandas.to_datetime(df.ServicedOn)