如何在午夜的熊猫中分配时间记录

发布于 2025-02-13 17:52:24 字数 881 浏览 1 评论 0原文

例如,如果我有以下数据:

df = pd.DataFrame({'Start': ['2022-01-01 08:30:00', '2022-01-01 13:00:00', '2022-01-02 22:00:00'],
                   'Stop': ['2022-01-01 12:00:00', '2022-01-02 10:30:00', '2022-01-04 8:00:00']})
df = df.apply(pd.to_datetime)

                Start                Stop
0 2022-01-01 08:30:00 2022-01-01 12:00:00
1 2022-01-01 13:00:00 2022-01-02 10:30:00
2 2022-01-02 22:00:00 2022-01-04 08:00:00

如何在午夜划分每个记录并将我的数据拆分,所以看起来像这样:

                Start                Stop
0 2022-01-01 08:30:00 2022-01-01 12:00:00
1 2022-01-01 13:00:00 2022-01-02 00:00:00
2 2022-01-02 00:00:00 2022-01-02 10:30:00
3 2022-01-02 22:00:00 2022-01-03 00:00:00
4 2022-01-03 00:00:00 2022-01-04 00:00:00
5 2022-01-04 00:00:00 2022-01-04 08:00:00

我想使用df ['stop'来计算每天每天记录的持续时间] -DF ['start']。也许还有另一种方法可以做到。谢谢你!

For example, if I have the following data:

df = pd.DataFrame({'Start': ['2022-01-01 08:30:00', '2022-01-01 13:00:00', '2022-01-02 22:00:00'],
                   'Stop': ['2022-01-01 12:00:00', '2022-01-02 10:30:00', '2022-01-04 8:00:00']})
df = df.apply(pd.to_datetime)

                Start                Stop
0 2022-01-01 08:30:00 2022-01-01 12:00:00
1 2022-01-01 13:00:00 2022-01-02 10:30:00
2 2022-01-02 22:00:00 2022-01-04 08:00:00

How can I split each record across midnight and upsample my data, so it looks like this:

                Start                Stop
0 2022-01-01 08:30:00 2022-01-01 12:00:00
1 2022-01-01 13:00:00 2022-01-02 00:00:00
2 2022-01-02 00:00:00 2022-01-02 10:30:00
3 2022-01-02 22:00:00 2022-01-03 00:00:00
4 2022-01-03 00:00:00 2022-01-04 00:00:00
5 2022-01-04 00:00:00 2022-01-04 08:00:00

I want to calculate the duration per day for each time record using df['Stop'] - df['Start']. Maybe there is another way to do it. Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寒尘 2025-02-20 17:52:24

您可以通过实现一个计算每一行分解所有日期的函数开始:

from datetime import timedelta


def split_date(start, stop):                                                                        
                                                                                                
    # Same day case                                                                                 
    if start.date() == stop.date():                                                                 
        return [(start, stop)]                                                                      
                                                                                                
                                                                                                
    # Several days split case                                                                       
    stop_split = start.replace(hour=0, minute=0, second=0) + timedelta(days=1)                      
    return [(start, stop_split)] + split_date(stop_split, stop)

然后,您可以通过计算每个记录的拆分来使用现有数据框架来创建一个新的记录:

new_dates = [
    elt for _, row in df.iterrows() for elt in split_date(row["Start"], row["Stop"])
]      
new_df = pd.DataFrame(new_dates, columns=["Start", "Stop"])

那么输出应该是您预期的一个记录:

                Start                Stop
0 2022-01-01 08:30:00 2022-01-01 12:00:00
1 2022-01-01 13:00:00 2022-01-02 00:00:00
2 2022-01-02 00:00:00 2022-01-02 10:30:00
3 2022-01-02 22:00:00 2022-01-03 00:00:00
4 2022-01-03 00:00:00 2022-01-04 00:00:00
5 2022-01-04 00:00:00 2022-01-04 08:00:00

You could start by implementing a function that computes all dates splits from each row :

from datetime import timedelta


def split_date(start, stop):                                                                        
                                                                                                
    # Same day case                                                                                 
    if start.date() == stop.date():                                                                 
        return [(start, stop)]                                                                      
                                                                                                
                                                                                                
    # Several days split case                                                                       
    stop_split = start.replace(hour=0, minute=0, second=0) + timedelta(days=1)                      
    return [(start, stop_split)] + split_date(stop_split, stop)

Then you can just use your existing dataframe to create a new one with all records by computing the split of each record :

new_dates = [
    elt for _, row in df.iterrows() for elt in split_date(row["Start"], row["Stop"])
]      
new_df = pd.DataFrame(new_dates, columns=["Start", "Stop"])

Then the output should be the one you expected :

                Start                Stop
0 2022-01-01 08:30:00 2022-01-01 12:00:00
1 2022-01-01 13:00:00 2022-01-02 00:00:00
2 2022-01-02 00:00:00 2022-01-02 10:30:00
3 2022-01-02 22:00:00 2022-01-03 00:00:00
4 2022-01-03 00:00:00 2022-01-04 00:00:00
5 2022-01-04 00:00:00 2022-01-04 08:00:00
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文