【问题标题】:Turn pandas datetime to hour:min rounded to 15 min将 pandas 日期时间转为小时:分钟四舍五入为 15 分钟
【发布时间】:2020-03-23 11:37:02
【问题描述】:

我使用这个命令用 pandas 阅读了这个 Excel 表格(只有“DATEHEUREMAX”列):

xdata = read_excel('Data.xlsx', 'Data', usecols=['DATEHEUREMAX'])

现在我想把这个 df 变成一个简化的 df,只有小时:分钟四舍五入到 15 分钟。主要思想是根据小时:分钟绘制直方图

【问题讨论】:

标签: python pandas dataframe datetime datetime-format


【解决方案1】:

无需对您的列进行四舍五入即可获得包含DATEHEUREMAX 列的日期直方图。为此,您可以使用pd.Grouper,详情如下。

玩具示例代码

您可以使用此示例来获得日期列的解决方案:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Generating a sample of 10000 timestamps and selecting 500 to randomize them
df = pd.DataFrame(np.random.choice(pd.date_range(start=pd.to_datetime('2015-01-14'),periods = 10000, freq='S'), 500),  columns=['date'])
# Setting the date as the index since the TimeGrouper works on Index, the date column is not dropped to be able to count
df.set_index('date', drop=False, inplace=True)
# Getting the histogram
df.groupby(pd.Grouper(freq='15Min')).count().plot(kind='bar')
plt.show()

此代码解析为如下图:

数据解决方案

对于您的数据,您应该能够执行以下操作:

import pandas as pd
import matplotlib.pyplot as plt
xdata = read_excel('Data.xlsx', 'Data', usecols=['DATEHEUREMAX'])
xdata.set_index('DATEHEUREMAX', drop=False, inplace=True)
xdata.groupby(pd.Grouper(freq='15Min')).count().plot(kind='bar')
plt.show()

【讨论】:

    【解决方案2】:

    考虑下面的DataFrame,只有一列,读作datetime(不是string):

                      Dat
    0 2019-06-03 12:07:00
    1 2019-06-04 10:04:00
    2 2019-06-05 11:42:00
    3 2019-06-06 10:17:00
    

    将这些日期四舍五入到 15 分钟运行:

    df['Dat2'] = df.Dat.dt.round('15T').dt.time.map(lambda s: str(s)[:-3])
    

    结果是:

                      Dat  Dat2
    0 2019-06-03 12:07:00 12:00
    1 2019-06-04 10:04:00 10:00
    2 2019-06-05 11:42:00 11:45
    3 2019-06-06 10:17:00 10:15
    

    出于演示目的,我将结果保存在新列中,但您可以 保存在原始列中。

    【讨论】:

      【解决方案3】:

      我想这就是你想要的

      rounded_column = df['time_column'].dt.round('15min').strftime("%H:%M")
      

      虽然我同意评论者的观点,但您可能真的不需要这样做,只需使用时间分组器

      【讨论】:

      • 真的很接近,如何去掉日期部分,只保留“10:45”?
      • 我的目标是绘制直方图以了解每个日期的频率
      猜你喜欢
      • 2013-10-17
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多