【问题标题】:Int/Float weighted average datetime in DataFrameDataFrame 中的 Int/Float 加权平均日期时间
【发布时间】:2016-11-10 18:26:24
【问题描述】:

我正在尝试找出采用intfloat 加权平均datetime 字段的方法。我正在考虑将datetime 转换为int,然后进行数学运算,然后再转换回datetime。但不知道该怎么做。非常感谢任何帮助。

我应该在这里更清楚。实际的问题是做这样的事情

>>> df1 = pd.DataFrame({'Date': {0: '2016-10-11', 1: '2016-10-11', 2: '2016-10-11', 3: '2016-10-11', 4: '2016-10-11',5: '2016-10-11'}, 'Qty': {0: 100, 1: 3232, 2: 4232, 3: 4322, 4: 666, 5: 98}, 'StartTime': {0: '08:00:00.241', 1: '08:00:00.243', 2: '12:34:23.563', 3: '08:14:05.908', 4: '18:54:50.100', 5: '10:08:36.657'},'Id':{0:'abc',1:'abc',2:'bcd',3:'bcd',4:'abc',5:'bcd'}})
>>> df1
         Date   Id   Qty     StartTime
0  2016-10-11  abc   100  08:00:00.241
1  2016-10-11  abc  3232  08:00:00.243
2  2016-10-11  bcd  4232  12:34:23.563
3  2016-10-11  bcd  4322  08:14:05.908
4  2016-10-11  abc   666  18:54:50.100
5  2016-10-11  bcd    98  10:08:36.657
>>> df1['StartTime'] = pd.to_datetime(df1['Date'] + ' ' + df1['StartTime'])
>>> df1['StartTime'][0]
Timestamp('2016-10-11 08:00:00.241000')

现在我正在尝试分组Id 并采用Qty 加权StartTime。请注意,StartTime 也有微秒分量。
以下似乎不起作用,即使StartTime 列的每个项目都是Timestamp

>>> (df1.groupby['Id']).apply(lambda x:np.average(x['StartTime'], weights=x['Qty']))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'instancemethod' object has no attribute '__getitem__'

【问题讨论】:

  • 一些代码将有助于更好地展示您的问题。

标签: python datetime dataframe floating-point int


【解决方案1】:

您可以使用total_seconds() 为您提供一个整数,该整数可用于平均多个datetime 值。

def avg_date(lst):
    epoch = datetime.datetime(1900, 1, 1)
    seconds_per_day = 3600 * 24
    avg = sum((d - epoch).total_seconds() for d in lst) / len(lst)
    return epoch + datetime.timedelta(avg // seconds_per_day, avg % seconds_per_day)

【讨论】:

  • 感谢您的回复@Mark。但是我需要包括微秒。另外,早些时候我的问题不够明确,需要将其应用于DataFrame 列。
【解决方案2】:

你可以使用时间戳

import datetime 
dt1 = datetime.datetime.now()
dt2 = datetime.datetime(1980, 1, 1)
timestamp1 = dt1.timestamp()
timestamp2 = dt2.timestamp()
timestamp_avg = (timestamp2+timestamp1)/2
dt_avg = datetime.datetime.fromtimestamp(timestamp_avg)
print(dt_avg)

【讨论】:

  • 感谢您的回复@SergeyLebedev。我之前的问题不够明确,我需要将其应用于DataFrame 列。虽然列是TimeStamp,但这似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 2012-06-06
  • 2020-11-18
相关资源
最近更新 更多