【问题标题】:Transpose Pandas DataFrame by select Datetime values in rows通过选择行中的日期时间值来转置 Pandas DataFrame
【发布时间】:2017-01-31 23:29:49
【问题描述】:

我有一个简单的 Pandas DataFrame,如下所示:

Timestamp              Value
2017-01-03 00:00:00    13.05
2017-01-03 00:01:00    13.70
2017-01-03 00:02:00    13.07
...
2017-01-27 09:57:00    13.46
2017-01-27 09:58:00    13.43
2017-01-27 09:59:00    13.41

如何转换它以便每天有一行,以及特定小时和分钟的列(比如从 0 到 10 小时)(时间戳中没有秒,它们都是零)。

到目前为止,我可以成功地使用df[df.index.time < datetime.time(10,0)] 来选择每天 10 小时以下的行。但是如果我随后使用.T 来转置该选择,那么整个 DataFrame 会转置为一个非常长的行。如何从时间戳中的每个不同日期对多批行执行 .T 操作? (也可能将每个 Day 值放在转置数据集的第一列?

我宁愿避免自定义代码和循环,因为数据集很大,所以更喜欢内置的东西!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    将索引设置为日期和时间的多索引,后跟unstack

    df.set_index(
        [df.Timestamp.dt.date, df.Timestamp.dt.time]
    ).Value.rename_axis([None] * 2).unstack()
    

    【讨论】:

      【解决方案2】:

      你可以使用pivot_table方法:

      In [214]: df.assign(d=df.Timestamp.dt.date, t=df.Timestamp.dt.time) \
                  .pivot_table(index='d', columns='t', values='Value', fill_value=0) \
                  .rename_axis(None, 1)
      Out[214]:
                  00:00:00  00:01:00  00:02:00  09:57:00  09:58:00  09:59:00
      2017-01-03     13.05      13.7     13.07      0.00      0.00      0.00
      2017-01-27      0.00       0.0      0.00     13.46     13.43     13.41
      

      PS 但我更喜欢@piRSquared 的解决方案,因为它更优雅...

      【讨论】:

        猜你喜欢
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        相关资源
        最近更新 更多