【问题标题】:Remove 'seconds' and 'minutes' from a Pandas dataframe column从 Pandas 数据框列中删除“秒”和“分钟”
【发布时间】: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

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

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2017-06-10
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多