将 5 分钟时间间隔合并为每小时时间间隔的问题

问题描述 投票:0回答:2

这是我第一次发帖,如果我的帖子不是最好的,请原谅......

我之前看过这个,将 5 分钟间隔合并为每小时间隔,并显示每小时的流量。 将 5 分钟时间范围合并为每小时

这是我正在使用的 CSV 数据的片段。分隔符是逗号。数据从 20117 年 6 月一直持续到 2021 年底。

日期戳 时间戳 det_vol
2017-06-01 13:45 582
2017-06-01 13:50 592
2017-06-01 13:55 578
2017-06-01 14:00 544
2017-06-01 14:05 521

我使用

pd.read_csv()
读取数据,并对这些值进行排序,以获得 2017 年 8 月的所有成交量读数

vds2 = vds2[(vds2['datestamp'].dt.year == 2017) & (vds2['datestamp'].dt.month == 8)]
vds2 = vds2.rename(columns={'det_vol': 'Volume'})
vds2['Date'] = pd.to_datetime(vds2['datestamp']).dt.date
vds2['Time'] = pd.to_datetime(vds2['timestamp']).dt.time
vds2 = vds2[['Date','Time','Volume']]
vds2 = vds2.reset_index(drop=True)

这让我得到了最终的数据框:

          Date       Time    Volume
0   2017-08-01      00:00        57
1   2017-08-01      00:05        97
2   2017-08-01      00:10        79
3   2017-08-01      00:15        63
4   2017-08-01      00:20        87
... ... ... ...

但是,当我尝试实现以下内容时,我在第一行出现错误

vds2.index = pd.to_datetime(vds2['Date'] + ' ' + vds2['Time'])
vds2 = vds2.resample('H').agg({'Volume':'sum'})

TypeError: unsupported operand type(s) for +: 'DatetimeArray' and 'str'

我想问题可能在于

Date
Time
的格式,这就是我尝试实施的原因

vds2['Date'] = pd.to_datetime(vds2['Date']).dt.date
vds2['Time'] = pd.to_datetime(vds2['Time']).dt.time

但是我仍然遇到类似的错误...

TypeError: unsupported operand type(s) for +: 'datetime.date' and 'str'

我确信这很简单,但希望得到任何帮助。谢谢!

python pandas datetime
2个回答
0
投票

在测试了您的附加代码并从示例中创建了一个小的“CSV”文件后,我遇到了相同的不需要的错误。我不确定,但在搜索中似乎发生的情况是以下代码行将您的时间戳存储为字符串。

vds2['Time'] = pd.to_datetime(vds2['timestamp']).dt.time

对“pd.to_datetime”函数的后续调用失败了。

当我尝试各种场景并获取输出时,我没有转换日期戳或时间戳字段。我只是让它们保持原样。所以我所做的只是在从“CSV”文件导入数据后重命名列。以下是我的示例代码,基于您的程序,但没有进行任何数据元素转换。我只是重命名列。

import pandas as pd

vds2=pd.read_csv('DateTime.csv')

print(vds2)

#vds2 = vds2[(vds2['datestamp'].dt.year == 2017) & (vds2['datestamp'].dt.month == 8)]
vds2 = vds2.rename(columns={'det_vol': 'Volume'})
vds2 = vds2.rename(columns={'datestamp': 'Date'})
vds2 = vds2.rename(columns={'timestamp': 'Time'})
vds2 = vds2[['Date','Time','Volume']]
vds2 = vds2.reset_index(drop=True)

vds2.index = pd.to_datetime(vds2['Date'] + ' ' + vds2['Time'])
vds2.index.name = 'Date and Time'
vds2 = vds2.resample('H').agg({'Volume':'sum'})

rslt_df = vds2[vds2['Volume'] > 0]

print(rslt_df)

在示例数据上运行此程序会在我的终端上产生以下输出。

@Una:~/Python_Programs/DateTime$ python3 DateTime.py 
   index datestamp timestamp  det_vol
0      0  6/1/2017     13:45      582
1      1  6/1/2017     13:50      592
2      2  6/1/2017     13:55      578
3      3  6/1/2017     14:00      544
4      4  6/1/2017     14:05      521
                     Volume
Date and Time              
2017-06-01 13:00:00    1752
2017-06-01 14:00:00    1065

也许高于我薪资级别的人可以更好地解释当您的程序尝试将数据帧中的时间数据转换为时间戳时发生的情况,但看起来您当时甚至不需要通过日期时间函数。看起来您可以根据自己的喜好重命名列并继续汇总和处理。


0
投票
>>> df.index = pd.to_datetime(df['datestamp'] + df['timestamp'])
>>> df.resample('H').det_vol.sum()
2017-06-01 13:00:00    1752
2017-06-01 14:00:00    1065
Freq: H, Name: det_vol, dtype: int64

您需要在索引中包含日期时间才能重新采样。

© www.soinside.com 2019 - 2024. All rights reserved.