pandas 如何将日期时间列四舍五入到最近的四分之一小时

czq61nw1  于 2023-04-28  发布在  其他
关注(0)|答案(5)|浏览(142)

我将一个数据文件加载到Python pandas dataframe中。我有一个格式为2015-07-18 13:53:33.280的datetime列。
我需要做的是创建一个新的专栏,将其四舍五入到最接近的四分之一小时。因此,上面的日期将四舍五入为2015-07-18 13:45:00.000
我如何在Pandas中做到这一点?我尝试使用here的解决方案,但得到一个'Series' object has no attribute 'year'错误。

6rqinv9w

6rqinv9w1#

可以使用round(freq)。还有一个快捷方式column.dt用于访问日期时间函数(如@laurens-koppenol所建议的)。
下面是一行代码:

df['old column'].dt.round('15min')

有效频率的字符串别名可以在这里找到。完整工作示例:

In [1]: import pandas as pd    
In [2]: df = pd.DataFrame([pd.Timestamp('2015-07-18 13:53:33.280'),
                           pd.Timestamp('2015-07-18 13:33:33.330')],
                         columns=['old column'])

In [3]: df['new column']=df['old column'].dt.round('15min')  
In [4]: df
Out[4]: 
               old column          new column
0 2015-07-18 13:53:33.280 2015-07-18 14:00:00
1 2015-07-18 13:33:33.330 2015-07-18 13:30:00
evrscar2

evrscar22#

假设您的系列由datetime对象组成,则需要使用Series.apply。举例来说-

import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*(dt.minute // 15)))

上面的例子总是四舍五入到前一刻钟(行为类似于地板功能)。

编辑

四舍五入到正确的刻钟(如,如果上一刻钟过去7分30秒,则显示下一刻钟)。我们可以用下面的例子--

import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*round((float(dt.minute) + float(dt.second)/60) / 15)))

上面只考虑了最近的秒数,如果你想考虑毫秒/微秒,你可以把它加到上面的公式中,作为-(float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)

blmhpbnm

blmhpbnm3#

这看起来更好一点

column.dt.允许datetime函数用于datetime列,就像column.str.用于类似字符串的列一样
datetime类属性API参考

import pandas as pd

# test df
df = pd.DataFrame([{'old_column':pd.Timestamp('2015-07-18 13:53:33.280')}])

df['new_column'] = df['old_column'].dt.round('15min')

df
tjrkku2a

tjrkku2a4#

阿南德·S·库马尔的答案没有四舍五入到最近的四分之一小时,而是将分钟数截短到最近的15分钟以下。
实际上,在您的示例中,2015-07-18 13:53:33.280应该舍入为2015-07-18 14:00:00.000,因为53:33.280更接近60分钟而不是45分钟。
我在this post中找到了一个更可靠的舍入答案。
对于您的情况,这应该起作用:

import datetime

def round_time(time, round_to):
    """roundTo is the number of minutes to round to"""
    rounded = time + datetime.timedelta(minutes=round_to/2.)
    rounded -= datetime.timedelta(minutes=rounded.minute % round_to,
                                  seconds=rounded.second,
                                  microseconds=rounded.microsecond)
    return rounded

dt['dtcolumn'] = df['dtcolumn'].apply(lambda x: round_time(x))
zlhcx6iw

zlhcx6iw5#

如果您可以四舍五入到最接近的四分之一小时,那么执行.dt.to_freq('15min')也可以。请注意,它将更改dtype,这可能是所需的。

相关问题