繁体   English   中英

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

[英]Issue combining 5 minute time intervals into hourly time intervals

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

我以前看过这个,将我的 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'

我想也许问题是DateTime的格式,这就是我尝试实施的原因

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'

我敢肯定这很简单,但会很感激任何帮助。 谢谢!

>>> 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

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

在测试了您的附加代码并从您的示例中创建了一个小的“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

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

希望有帮助。

问候。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM