我将一个数据文件加载到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'错误。
2015-07-18 13:53:33.280
2015-07-18 13:45:00.000
'Series' object has no attribute 'year'
6rqinv9w1#
可以使用round(freq)。还有一个快捷方式column.dt用于访问日期时间函数(如@laurens-koppenol所建议的)。下面是一行代码:
round(freq)
column.dt
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
evrscar22#
假设您的系列由datetime对象组成,则需要使用Series.apply。举例来说-
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)
(float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)
blmhpbnm3#
column.dt.允许datetime函数用于datetime列,就像column.str.用于类似字符串的列一样datetime类属性API参考
column.dt.
column.str.
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
tjrkku2a4#
阿南德·S·库马尔的答案没有四舍五入到最近的四分之一小时,而是将分钟数截短到最近的15分钟以下。实际上,在您的示例中,2015-07-18 13:53:33.280应该舍入为2015-07-18 14:00:00.000,因为53:33.280更接近60分钟而不是45分钟。我在this post中找到了一个更可靠的舍入答案。对于您的情况,这应该起作用:
2015-07-18 14:00:00.000
53:33.280
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))
zlhcx6iw5#
如果您可以四舍五入到最接近的四分之一小时,那么执行.dt.to_freq('15min')也可以。请注意,它将更改dtype,这可能是所需的。
.dt.to_freq('15min')
5条答案
按热度按时间6rqinv9w1#
可以使用
round(freq)
。还有一个快捷方式column.dt
用于访问日期时间函数(如@laurens-koppenol所建议的)。下面是一行代码:
有效频率的字符串别名可以在这里找到。完整工作示例:
evrscar22#
假设您的系列由
datetime
对象组成,则需要使用Series.apply
。举例来说-上面的例子总是四舍五入到前一刻钟(行为类似于地板功能)。
编辑
四舍五入到正确的刻钟(如,如果上一刻钟过去7分30秒,则显示下一刻钟)。我们可以用下面的例子--
上面只考虑了最近的秒数,如果你想考虑毫秒/微秒,你可以把它加到上面的公式中,作为-
(float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)
blmhpbnm3#
这看起来更好一点
column.dt.
允许datetime函数用于datetime列,就像column.str.
用于类似字符串的列一样datetime类属性API参考
tjrkku2a4#
阿南德·S·库马尔的答案没有四舍五入到最近的四分之一小时,而是将分钟数截短到最近的15分钟以下。
实际上,在您的示例中,
2015-07-18 13:53:33.280
应该舍入为2015-07-18 14:00:00.000
,因为53:33.280
更接近60分钟而不是45分钟。我在this post中找到了一个更可靠的舍入答案。
对于您的情况,这应该起作用:
zlhcx6iw5#
如果您可以四舍五入到最接近的四分之一小时,那么执行
.dt.to_freq('15min')
也可以。请注意,它将更改dtype,这可能是所需的。