首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免嵌套.apply()

避免嵌套.apply()
EN

Stack Overflow用户
提问于 2021-04-16 15:03:50
回答 2查看 74关注 0票数 2

我正在处理一个由同一天/日期的不同时间组成的数据集。不同的时间表示给定事件的发生。除了时间之外,日期将在另一列中给出(有关更多细节,请参见下面的数据片段)。

为了进行进一步的数据处理,我需要将不同的时间和日期结合起来,以获得完整的日期时间戳。幸运的是,通过实现这样的嵌套.apply()调用,我能够实现所需的输出:

代码语言:javascript
运行
复制
import io

import pandas as pd


DATA_STRING = """
date        event_1     event_2     event_3  
2019-12-16  14:01:00    14:27:00    14:47:00
2020-01-16  13:47:00    14:08:00    14:28:00
2020-01-20  12:02:00    12:23:00    12:42:00
"""

TIME_COLUMNS = ['event_1', 'event_2', 'event_3']


def combine_timestamp(row):
    date = row['date']
    times = row[TIME_COLUMNS]
    return times.apply(lambda t: pd.Timestamp.combine(date, t.time()))


file_like = io.StringIO(DATA_STRING)
df = pd.read_csv(file_like, sep='\s+')

df['date'] = pd.to_datetime(df['date'])
df[TIME_COLUMNS] = df[TIME_COLUMNS].apply(pd.to_datetime)
# --> timestamps with date set to today (not a problem as time is relevant only)

df[TIME_COLUMNS] = df.apply(combine_timestamp, axis='columns')

print(df)

印刷:

代码语言:javascript
运行
复制
        date             event_1             event_2             event_3
0 2019-12-16 2019-12-16 14:01:00 2019-12-16 14:27:00 2019-12-16 14:47:00
1 2020-01-16 2020-01-16 13:47:00 2020-01-16 14:08:00 2020-01-16 14:28:00
2 2020-01-20 2020-01-20 12:02:00 2020-01-20 12:23:00 2020-01-20 12:42:00

但是,我想知道是否有一种更优雅的方法来实现这一点,并避免这些嵌套的.apply()‘调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-16 15:09:01

使用可以接受整个列的pd.to_datetime

代码语言:javascript
运行
复制
(df.filter(like='event').add(df.date, axis=0)
   .apply(pd.to_datetime,format='%H:%M:%S%Y-%m-%d')
)

另一种方法是pd.to_timedelta表示时间,pd.to_datetime表示日期:

代码语言:javascript
运行
复制
(df.filter(like='event')
   .apply(pd.to_timedelta)
   .add(pd.to_datetime(df.date), axis=0)
)

输出:

代码语言:javascript
运行
复制
              event_1             event_2             event_3
0 2019-12-16 14:01:00 2019-12-16 14:27:00 2019-12-16 14:47:00
1 2020-01-16 13:47:00 2020-01-16 14:08:00 2020-01-16 14:28:00
2 2020-01-20 12:02:00 2020-01-20 12:23:00 2020-01-20 12:42:00
票数 4
EN

Stack Overflow用户

发布于 2021-04-16 15:09:20

我可以这样想:将事件列的日期添加为字符串,然后转换为datetime:

代码语言:javascript
运行
复制
df = pd.read_csv(file_like, sep='\s+')
out = df.assign(**(df['date'].add(' ').to_numpy()[:,None] + df.filter(like='event')))
out = out.apply(pd.to_datetime)

代码语言:javascript
运行
复制
print(out)

         date             event_1             event_2             event_3
0  2019-12-16 2019-12-16 14:01:00 2019-12-16 14:27:00 2019-12-16 14:47:00
1  2020-01-16 2020-01-16 13:47:00 2020-01-16 14:08:00 2020-01-16 14:28:00
2  2020-01-20 2020-01-20 12:02:00 2020-01-20 12:23:00 2020-01-20 12:42:00
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67127681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档