【问题标题】:How to add one hour repeately from start time till to next day start time using panda python如何使用熊猫python从开始时间到第二天开始时间重复添加一小时
【发布时间】:2019-10-09 15:34:02
【问题描述】:

这里我有一个带有数据的 csv 文件。我想编写一个代码,开始时间从 csv 文件时间列第一次开始,它将等于 0。然后从那个时间添加一小时一小时直到第二天的开始时间。然后在那之后再次将时间变为 0 并增加一小时一小时直到第二天的开始时间。这个过程继续。

time_interval = 3600 (in seconds)
date_array = []
date_array.append(pd.to_datetime(data['date'][0]).date())
start_time = []
end_time   = []
temp_date  = pd.to_datetime(data['date'][0]).date()
start_time=0
for i in range(len(data['date'])):
 cur_date = pd.to_datetime(data['date'][i]).date()
 if( cur_date > temp_date):
    end_time.append(pd.to_datetime(data['time'][i-1], format='%H:%M:%S').time())
    start_time=0
    date_array.append(cur_date)
    temp_date = cur_date
end_time.append(pd.to_datetime(data['time'][len(data['date'])-1], format='%H:%M:%S').time())
datetime_array = []
for i in range(len(date_array)):
  s_time = start_time
  e_time = datetime.datetime.combine(date_array[i],  end_time[i])
print(datetime_array)

我没有得到我想要的答案。 在这里,我包括了我的 csv 文件。

【问题讨论】:

  • 您能否在问题中添加示例输入数据?
  • 什么是输入数据?只有一排?还是每天只有第一次排?你需要在每天 23:00 结束吗?还是在 10:00,自定义时间?
  • @Rakesh 我再次上传了我的 csv 文件。我希望你能理解我想要做什么。
  • @jezrael 我上传了新的 csv 文件。我希望你能理解我想要做什么。是的,我需要在每天 23:59:59 结束。我的开始时间将是自定义的。

标签: python-3.x pandas date time


【解决方案1】:

这就是你要找的东西

import pandas as pd

df = pd.DataFrame([
    ["10/3/2018"],
["10/3/2018"],
["10/3/2018"],
["10/3/2018"],
["10/3/2018"],
["10/3/2018"],
["10/4/2018"],
["10/4/2018"],
["10/4/2018"],
["10/4/2018"],
],columns=['date'])

df['date'] =  pd.to_datetime(df['date'], format='%d/%m/%Y')
start_time = '6:00:00'
df.loc[:,'time'] = start_time
increment = df.groupby(['date', 'time']).cumcount().astype('timedelta64[h]')
df.loc[:,'time'] = pd.to_timedelta(df.loc[:,'time'])
df['time'] =  df['time'] + increment

输出

        date     time
0 2018-03-10 06:00:00
1 2018-03-10 07:00:00
2 2018-03-10 08:00:00
3 2018-03-10 09:00:00
4 2018-03-10 10:00:00
5 2018-03-10 11:00:00
6 2018-04-10 06:00:00
7 2018-04-10 07:00:00
8 2018-04-10 08:00:00
9 2018-04-10 09:00:00

【讨论】:

  • 感谢您的回复。但这实际上不是我要寻找的。在这里,我上传了新的 csv 文件。希望你能理解。
【解决方案2】:

您可以创建由日期时间填充的新列,然后使用 GroupBy.transform 获取每天的第一个值以使用日期时间进行减法,最后将 timedeltas 通过 Series.dt.total_seconds 转换为分钟:

df = pd.DataFrame({
        'date':['10/3/2018'] * 5 + ['10/4/2018'],
        'time':['6:00:00','7:00:00','8:00:00','9:00:00','10:00:00','6:00:00'],
        'col':[4,8,9,4,2,3],

})

df['datetime'] =  pd.to_datetime(df['date'] + df['time'], format='%d/%m/%Y%H:%M:%S')
first = df.groupby('date')['datetime'].transform('first')
df['new'] = df['datetime'].sub(first).dt.total_seconds().div(60).astype(int)
print (df)

        date      time  col            datetime  new
0  10/3/2018   6:00:00    4 2018-03-10 06:00:00    0
1  10/3/2018   7:00:00    8 2018-03-10 07:00:00   60
2  10/3/2018   8:00:00    9 2018-03-10 08:00:00  120
3  10/3/2018   9:00:00    4 2018-03-10 09:00:00  180
4  10/3/2018  10:00:00    2 2018-03-10 10:00:00  240
5  10/4/2018   6:00:00    3 2018-04-10 06:00:00    0

详情

print (first)
0   2018-03-10 06:00:00
1   2018-03-10 06:00:00
2   2018-03-10 06:00:00
3   2018-03-10 06:00:00
4   2018-03-10 06:00:00
5   2018-04-10 06:00:00
Name: datetime, dtype: datetime64[ns]

【讨论】:

  • 感谢您的回复。如果我有大数据集,那么我如何读取带有时间和日期的 csv 文件。数据框会很长。你能建议我一个选择吗?然后我必须把它写在 for loop i range 中。
  • @awa - 您可以使用 df = pd.read_csv(file) 将文件转换为 DataFrame - read_csv
  • 非常感谢您对我的帮助。你拯救了我的一天。
  • 我还有一个问题。我上传了另一张 csv 文件的图片,以了解我将要向您提出的问题。根据第二张图片假设我的开始时间是 10:00:00,那么它是 ==0。在那之后,我的第二次是 11:15:00,我想将其称为 120 分钟。之后我的第三次是 12:00:00,然后是 180 分钟,我的第四次是 14:00:00,然后是 240 分钟。那么我们可以为此编写代码吗?
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 2018-01-21
  • 2013-01-29
  • 2020-04-13
  • 1970-01-01
  • 2019-04-30
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多