Python和Pandas:如何在不同分辨率上向上/向下舍入unix时间戳(utc):1min-5min-15min-30min-1H-1D?

时间:2017-02-20 20:52:52

标签: python pandas datetime unix-timestamp utc

考虑到以下时间分辨率示例,将UNIX时间轮到获得下面结果的最快方法是什么?在简单的python和pandas数据帧中都有吗?

import time
unix_current = int(time.time())
unix_from_down_example = int("1453823631")
unix_from_up_example = int("1453820476")

向下舍入/最多1分钟

+---------------+---------------------+------------+
|               |                     | Unix (UTC) |
| from          | 26.01.2016 15:53:51 | 1453823631 |
| to round down | 26.01.2016 15:53:00 | 1453823580 |
|               |                     |            |
| from          | 26.01.2016 15:01:16 | 1453820476 |
| to round up   | 26.01.2016 15:02:00 | 1453820520 |
+---------------+---------------------+------------+

向下/最多5分钟

+---------------+---------------------+------------+
|               |                     | Unix (UTC) |
| from          | 26.01.2016 15:53:51 | 1453823631 |
| to round down | 26.01.2016 15:50:00 | 1453823400 |
|               |                     |            |
| from          | 26.01.2016 15:01:16 | 1453820476 |
| to round up   | 26.01.2016 15:05:00 | 1453820700 |
+---------------+---------------------+------------+

向下/最多15分钟

+---------------+---------------------+------------+
|               |                     | Unix (UTC) |
| from          | 26.01.2016 15:53:51 | 1453823631 |
| to round down | 26.01.2016 15:45:00 | 1453823100 |
|               |                     |            |
| from          | 26.01.2016 15:01:16 | 1453820476 |
| to round up   | 26.01.2016 15:15:00 | 1453821300 |
+---------------+---------------------+------------+

向下/最多30分钟

+---------------+---------------------+------------+
|               |                     | Unix (UTC) |
| from          | 26.01.2016 15:53:51 | 1453823631 |
| to round down | 26.01.2016 15:30:00 | 1453822200 |
|               |                     |            |
| from          | 26.01.2016 15:01:16 | 1453820476 |
| to round up   | 26.01.2016 15:30:00 | 1453822200 |
+---------------+---------------------+------------+

向下/最多1小时

+---------------+---------------------+------------+
|               |                     | Unix (UTC) |
| from          | 26.01.2016 15:53:51 | 1453823631 |
| to round down | 26.01.2016 15:00:00 | 1453820400 |
|               |                     |            |
| from          | 26.01.2016 15:01:16 | 1453820476 |
| to round up   | 26.01.2016 16:00:00 | 1453824000 |
+---------------+---------------------+------------+

向下/最多1天

+---------------+---------------------+------------+
|               |                     | Unix (UTC) |
| from          | 26.01.2016 15:53:51 | 1453823631 |
| to round down | 26.01.2016 00:00:00 | 1453766400 |
|               |                     |            |
| from          | 26.01.2016 15:01:16 | 1453820476 |
| to round up   | 27.01.2016 00:00:00 | 1453852800 |
+---------------+---------------------+------------+

我使用此website 作为给定示例的转换参考。

2 个答案:

答案 0 :(得分:2)

舍入DOWN的通用公式:

n // <Number of seconds> * <Number of seconds>

舍入UP的通用公式:

n // <Number of seconds> * <Number of seconds> + <Number of seconds>

功能:

def round_unix_date(dt_series, seconds=60, up=False):
    return dt_series // seconds * seconds + seconds * up

用法:

In [204]: df
Out[204]:
        Date1       Date2
0  1453823631  1453820476
1  1453823631  1453820476
2  1453823631  1453820476

In [205]: round_unix_date(df.Date1, 5*60)
Out[205]:
0    1453823400
1    1453823400
2    1453823400
Name: Date1, dtype: int64

In [206]: round_unix_date(df.Date2, 5*60, up=True)
Out[206]:
0    1453820700
1    1453820700
2    1453820700
Name: Date2, dtype: int64

演示(向下舍入):

In [165]: n // (1 * 60) * (1 * 60)
Out[165]: 1453823580

In [166]: n // (5 * 60) * (5 * 60)
Out[166]: 1453823400

In [167]: n = 1453823631

In [168]: n // (1 * 60) * (1 * 60)
Out[168]: 1453823580

In [169]: n // (5 * 60) * (5 * 60)
Out[169]: 1453823400

In [170]: n // (15 * 60) * (15 * 60)
Out[170]: 1453823100

In [171]: n // (30 * 60) * (30 * 60)
Out[171]: 1453822200

In [172]: n // (60 * 60) * (60 * 60)
Out[172]: 1453820400

In [173]: n // (24 * 60 * 60) * (24 * 60 * 60)
Out[173]: 1453766400

演示(四舍五入):

In [188]: n = 1453820476

In [189]: n // (1 * 60) * (1 * 60) + 60
Out[189]: 1453820520

In [191]: n // (5 * 60) * (5 * 60) + 5*60
Out[191]: 1453820700

In [192]: n // (15 * 60) * (15 * 60) + 15*60
Out[192]: 1453821300

...

<强>更新

In [226]: round_unix_date(df.Date1, 24*60*60)
Out[226]:
0    1453766400
1    1453766400
2    1453766400
Name: Date1, dtype: int64

In [227]: round_unix_date(df.Date2, 24*60*60, up=True)
Out[227]:
0    1453852800
1    1453852800
2    1453852800
Name: Date2, dtype: int64

答案 1 :(得分:1)

我不知道Pandas中的任何功能可以帮助您完成此任务。一个好的解决方案就是编写一个Python函数,然后使用pandas中的 apply 函数将其应用于数据框的一列。

将timestamp列转换为datetime对象。这应该可以帮助您轻松获得时间戳的不同单位。

以下是一些帮助您的逻辑:

# round down
t_down = t.replace(second=0)

# round up
t += timedelta(minutes=1)
t_up = t.replace(second=0)

回合1分钟

只需截断倒圆的秒字段即可。如果向下舍入,请添加一分钟并截断一秒钟。

# round down
diff = t.minute % 5
t_sub = timedelta(minutes=diff)
t_down = t - t_sub

# round up
diff = t.minute % 5
t_sub = timedelta(minutes=5-diff)
t_up = t + t_sub

回合5分钟

你必须在这里玩一些模拟算法。以下示例为5分钟,但您只需将 5 替换为所需的分钟数,即可将此修改延长15分钟和30分钟。

# round down
t_down = t.replace(minute=0, second=0)

# round up
t += timedelta(hours=1)
t_up = t.replace(minute=0, second=0)

回合1小时

使用与1分钟相同的方法,使用小时而不是分钟。

# round down
t_down = t.replace(hour=0 ,minute=0, second=0)

# round up
t += timedelta(days=1)
t_up = t.replace(hour=0, minute=0, second=0)

回合1天

再次延长1分1小时的例子。

{{1}}

一个好主意是为您要处理的每个案例创建一个函数。然后有另一个函数根据用户想要执行的当前任务调用其中一个函数。