从 Pandas 数据框列中删除“秒”和“分钟”

Posted

技术标签:

【中文标题】从 Pandas 数据框列中删除“秒”和“分钟”【英文标题】:Remove 'seconds' and 'minutes' from a Pandas dataframe column 【发布时间】:2017-09-10 01:14:56 【问题描述】:

给定一个如下的数据框:

import numpy as np
import pandas as pd

df = pd.DataFrame(
'Date' : pd.date_range('1/1/2011', periods=5, freq='3675S'),
 'Num' : np.random.rand(5))
                 Date       Num
0 2011-01-01 00:00:00  0.580997
1 2011-01-01 01:01:15  0.407332
2 2011-01-01 02:02:30  0.786035
3 2011-01-01 03:03:45  0.821792
4 2011-01-01 04:05:00  0.807869

我想删除“分钟”和“秒”信息。

以下内容(大部分来自:How to remove the 'seconds' of Pandas dataframe index?)工作正常,

df = df.assign(Date = lambda x: pd.to_datetime(x['Date'].dt.strftime('%Y-%m-%d %H')))
                 Date       Num
0 2011-01-01 00:00:00  0.580997
1 2011-01-01 01:00:00  0.407332
2 2011-01-01 02:00:00  0.786035
3 2011-01-01 03:00:00  0.821792
4 2011-01-01 04:00:00  0.807869

但是将日期时间转换为字符串然后再转换回日期时间感觉很奇怪。有没有办法更直接地做到这一点?

【问题讨论】:

【参考方案1】:

dt.round

这应该是怎么做的...使用dt.round

df.assign(Date=df.Date.dt.round('H'))

                 Date       Num
0 2011-01-01 00:00:00  0.577957
1 2011-01-01 01:00:00  0.995748
2 2011-01-01 02:00:00  0.864013
3 2011-01-01 03:00:00  0.468762
4 2011-01-01 04:00:00  0.866827

老答案

一种方法是设置索引并使用resample

df.set_index('Date').resample('H').last().reset_index()

                 Date       Num
0 2011-01-01 00:00:00  0.577957
1 2011-01-01 01:00:00  0.995748
2 2011-01-01 02:00:00  0.864013
3 2011-01-01 03:00:00  0.468762
4 2011-01-01 04:00:00  0.866827

另一种选择是剥离 datehour 组件

df.assign(
    Date=pd.to_datetime(df.Date.dt.date) +
         pd.to_timedelta(df.Date.dt.hour, unit='H'))

                 Date       Num
0 2011-01-01 00:00:00  0.577957
1 2011-01-01 01:00:00  0.995748
2 2011-01-01 02:00:00  0.864013
3 2011-01-01 03:00:00  0.468762
4 2011-01-01 04:00:00  0.866827

【讨论】:

原来dt.floor 对我的情况更好,尽管我希望dt.round 总体上更好。 -谢谢 注意:2030-01-01 21:54:00 的回合是 2030-01-01 22:00:00 而不是 2030-01-01 21:00:00 --- to这样做使用 dt.floor 或者:df.Date = df.Date.dt.floor('H')【参考方案2】:

其他解决方案可能是这样的:

df.Date = pd.to_datetime(df.Date)
df.Date = df.Date.apply(lambda x: datetime(x.year, x.month, x.day, x.hour))

【讨论】:

以上是关于从 Pandas 数据框列中删除“秒”和“分钟”的主要内容,如果未能解决你的问题,请参考以下文章

检查列表中的单词并在 pandas 数据框列中删除这些单词

从 pandas 数据框列中查找所有正则表达式匹配项

Pandas:如何将数据框列中的“时间戳”值从对象/字符串转换为时间戳?

如何从 Pandas 数据框列中的日期时间减去 3 小时?

根据列名删除 Pandas 数据框列

按条件从列表的数据框列中计算和删除元素