Pandas从一个单独的日期列表中的相应日期得到delta

hyrbngr7  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(129)

我有一个 Dataframe :

df a b
   7 2019-05-01 00:00:01
   6 2019-05-02 00:15:01 
   1 2019-05-06 00:10:01
   3 2019-05-09 01:00:01
   8 2019-05-09 04:20:01
   9 2019-05-12 01:10:01
   4 2019-05-16 03:30:01

还有
l = [datetime.datetime(2019,05,02), datetime.datetime(2019,05,10), datetime.datetime(2019,05,22) ]
我想添加一列,内容如下:对于每一行,从l开始找出它之前的最后一个日期,并加上它们之间的天数。如果没有一个日期小于l,则加上最小日期的差值。因此,新列将是:

df a b.                 delta            date
   7 2019-05-01 00:00:01 -1     datetime.datetime(2019,05,02)
   6 2019-05-02 00:15:01  0     datetime.datetime(2019,05,02)
   1 2019-05-06 00:10:01  4     datetime.datetime(2019,05,02)
   3 2019-05-09 01:00:01  7     datetime.datetime(2019,05,02)
   8 2019-05-09 04:20:01  7     datetime.datetime(2019,05,02)
   9 2019-05-12 01:10:01  2     datetime.datetime(2019,05,10)
   4 2019-05-16 03:30:01  6     datetime.datetime(2019,05,10)

我该怎么做?

uhry853o

uhry853o1#

使用merge_asof对齐df['b']和列表(作为Series),然后计算差值:

# ensure datetime
df['b'] = pd.to_datetime(df['b'])

# craft Series for merging (could be combined with line below)
s = pd.Series(l, name='l')

# merge and fillna with minimum date
ref = pd.merge_asof(df['b'], s, left_on='b', right_on='l')['l'].fillna(s.min())

# compute the delta as days
df['delta'] =(df['b']-ref).dt.days

输出:

a                   b  delta
0  7 2019-05-01 00:00:01     -1
1  6 2019-05-02 00:15:01      0
2  1 2019-05-06 00:10:01      4
3  3 2019-05-09 01:00:01      7
4  8 2019-05-09 04:20:01      7
5  9 2019-05-12 01:10:01      2
6  4 2019-05-16 03:30:01      6
ymdaylpp

ymdaylpp2#

如果你的b列有datetime对象,这里有一行的解决方案。否则,将其转换为datetime对象。

df['delta'] = df.apply(lambda x: sorted([x.b - i for i in l], key= lambda y: y.seconds)[0].days, axis=1)

说明:对每一行应用一个函数:

  • 计算行的datetimel中存在的每个datetime之间的deltatime,然后将其存储在列表中
  • 按每个deltatime的秒数对此列表排序
  • 获取第一个值(具有最小的deltatime)并返回其days
kcugc4gi

kcugc4gi3#

此代码将此数据集分隔在

  • 工作日星期五
  • 2014年
  • 01天
  • 小时00
  • 分钟03
rides['weekday'] = rides.timestamp.dt.strftime("%A")
rides['year'] = rides.timestamp.dt.strftime("%Y")
rides['day'] = rides.timestamp.dt.strftime("%d")
rides['hour'] = rides.timestamp.dt.strftime("%H")
rides["minute"] = rides.timestamp.dt.strftime("%M")

相关问题