【问题标题】:Count days but start them with given hour计算天数,但从给定小时开始
【发布时间】:2019-11-07 22:55:31
【问题描述】:

我有一个这种格式的表格:

                 date
0 2017-03-30 09:59:00
1 2017-03-30 09:59:30
2 2017-03-30 10:00:00
3 2017-03-30 10:00:30
4 2017-03-30 10:01:00
5 2017-03-30 10:01:30
6 2017-03-30 10:02:00

我想做的是计算我表中的天数(从 1 开始),而不是从午夜开始,我希望我的天数从 10:00:00 开始 >。所以对于上表,结果将是:

                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

到目前为止,我设法使用以下代码生成了新列:

d=1
hour_before = 10
col_days = []
for row in df.itertuples(): 
    if row.date.hour == 10 and hour_before != 10 : 
            d+= 1
    hour_before = row.date.hour 
    cols_days.append(d)
df['day'] = col_days

但我希望有一种更优雅(更重要的是,更快)的方式来执行此操作。

有什么建议吗?

【问题讨论】:

  • 我相信人们已经厌倦了在 cmets 中看到这个链接,但是每次我在代码中看到 iterrows 时,我都会有一种下意识的反应。 DO NOT USE ITERROWS!
  • 我从来没有看过这个链接,非常感谢你的提示,我会保存它。

标签: python pandas datetime time


【解决方案1】:

如果您将数据向后移动 10 小时,然后按天对行进行分组,该怎么办?然后你可以在日期上使用pd.factorize,这应该很快。

df['day'] = pd.factorize((df['date'] - pd.Timedelta(hours=10)).dt.date)[0]
df
                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

GroupBy.ngroup 是另一种选择:

df['day'] = df.groupby((df['date'] - pd.Timedelta(hours=10)).dt.date).ngroup()
df
                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多