考虑到以下时间分辨率示例,将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 作为给定示例的转换参考。
答案 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)
只需截断倒圆的秒字段即可。如果向下舍入,请添加一分钟并截断一秒钟。
# 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 替换为所需的分钟数,即可将此修改延长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分钟相同的方法,使用小时而不是分钟。
# 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}}
一个好主意是为您要处理的每个案例创建一个函数。然后有另一个函数根据用户想要执行的当前任务调用其中一个函数。