首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何遍历pandas DataFrame的列

如何遍历pandas DataFrame的列
EN

Stack Overflow用户
提问于 2018-08-08 23:14:08
回答 2查看 2.6K关注 0票数 1

我有一个有数千行的CSV文件。该文件有3列日期、时间和值。我想首先循环遍历date列,然后遍历time列,然后将两个特定时间之间的值相加。在Pandas中有什么函数可以做到这一点吗?下面是我的示例CSV。日期不是连续的,但它们是升序的。

代码语言:javascript
复制
Date    Time    Value
29-Jan-18   11:00   10
29-Jan-18   12:00   11
29-Jan-18   13:00   12
29-Jan-18   14:00   13
31-Jan-18   11:00   90
31-Jan-18   12:00   91
31-Jan-18   13:00   92
31-Jan-18   14:00   93

我希望输出为“对于29-Jan-18和时间11到13,值的总和是33”。

不完全是11-12,但有一系列。计算将针对9-10、10-11、11-13、13-15进行,但在CSV文件中,每小时都存在。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-09 00:22:21

您可以通过使用resample方法来实现此目的。

首先,您需要合并日期列和时间列,以创建单个日期时间索引。假设您的两个列是字符串(如果不是,您可以对它们调用as_type(str) ),您可以连接这两个列,将它们转换为datetime列,并将该datetime列转换为DataFrame的DatetimeIndex

然后调用resample,将规则设置为'3H'以创建宽度为3小时的存储箱,并将base=11设置为上午11点开始(当然,如果您愿意/需要的话),并在DataFrame上设置sum

下面是一个示例:

代码语言:javascript
复制
import pandas as pd
import datetime as dt

df.index = pd.DatetimeIndex(pd.to_datetime(df.Date.str.cat(df.Time, sep=' ')))
df = df.resample('1H').sum() # to fill missing values
# get values for 9 & 10
df1 = df[(dt.time(9) <= df.index.time) & (df.index.time <= dt.time(10))]
# get values for 11-13 & 13-15
two_hour_ranges = df[df.index.time >= dt.time(11)].resample('2H', base=11).sum()
df2 = two_hour_ranges[(dt.time(11) <= two_hour_ranges.index.time) & (two_hour_ranges.index.time < dt.time(15))]

# merge
df = pd.concat([df1, df2]).sort_index()

使用您的给定数据作为输入的df的示例输出(我在1/29和1/31添加了9:00和10:00的值):

代码语言:javascript
复制
                     Value
Date                     
2018-01-29 09:00:00      4
2018-01-29 10:00:00      5
2018-01-29 11:00:00     21
2018-01-29 13:00:00     25
2018-01-30 09:00:00      0
2018-01-30 10:00:00      0
2018-01-30 11:00:00      0
2018-01-30 13:00:00      0
2018-01-31 09:00:00     70
2018-01-31 10:00:00     80
2018-01-31 11:00:00    181
2018-01-31 13:00:00    185

以下是有关resample的更多文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.resample.html

票数 0
EN

Stack Overflow用户

发布于 2018-08-09 00:17:54

主要思想是将日期/时间列转换为datetime对象,然后对这些对象进行日期过滤。我假设它们是从字符串开始的。

我不确定您的日期是如何传入的,但希望您能弄清楚如何从中创建datetime对象。如果没有,请让我知道,我们可以更新。下面是一个示例,说明如何按日期过滤,并在开始/结束日期内求和:

代码语言:javascript
复制
import numpy as np
import pandas as pd
import datetime

cols = ["Date", "Time", "Value"]

rows = [["29-Jan-18", "11:00", 10],
        ["29-Jan-18", "12:00", 11],
        ["29-Jan-18", "13:00", 12],
        ["29-Jan-18", "14:00", 13],
        ["31-Jan-18", "11:00", 90],
        ["31-Jan-18", "12:00", 91],
        ["31-Jan-18", "13:00", 92],
        ["31-Jan-18", "14:00", 93]]

df = pd.DataFrame(rows, columns=cols)

df['datetime_str'] = df['Date'].str.cat(df['Time'].astype(str), sep=" ")
df['datetime'] = df['datetime_str'].apply(lambda d: datetime.datetime.strptime(d, '%d-%b-%y %H:%M'))
print(df)
print()

# Hopefully you can figure out how to beat incoming start/end date into datetime.
# If not, let me know how the start/end are coming in and we can write a function to do it
start_date = datetime.datetime.strptime("29-Jan-18 11:00", '%d-%b-%y %H:%M')
end_date = datetime.datetime.strptime("29-Jan-18 13:00", '%d-%b-%y %H:%M')

value_sum = df[ (df['datetime'] >= start_date) & (df['datetime'] <= end_date) ]['Value'].sum()
print("Value sum from " + str(start_date) + " to " + str(end_date) + ": ", value_sum)

# Works accross days as well                                                                                                                                                                                
start_date = datetime.datetime.strptime("29-Jan-18 13:00", '%d-%b-%y %H:%M')
end_date = datetime.datetime.strptime("31-Jan-18 13:00", '%d-%b-%y %H:%M')

value_sum = df[ (df['datetime'] >= start_date) & (df['datetime'] <= end_date) ]['Value'].sum()
print("Value sum from " + str(start_date) + " to " + str(end_date) + ": ", value_sum)

这将输出以下内容:

代码语言:javascript
复制
        Date   Time  Value     datetime_str            datetime
0  29-Jan-18  11:00     10  29-Jan-18 11:00 2018-01-29 11:00:00
1  29-Jan-18  12:00     11  29-Jan-18 12:00 2018-01-29 12:00:00
2  29-Jan-18  13:00     12  29-Jan-18 13:00 2018-01-29 13:00:00
3  29-Jan-18  14:00     13  29-Jan-18 14:00 2018-01-29 14:00:00
4  31-Jan-18  11:00     90  31-Jan-18 11:00 2018-01-31 11:00:00
5  31-Jan-18  12:00     91  31-Jan-18 12:00 2018-01-31 12:00:00
6  31-Jan-18  13:00     92  31-Jan-18 13:00 2018-01-31 13:00:00
7  31-Jan-18  14:00     93  31-Jan-18 14:00 2018-01-31 14:00:00

Value sum from 2018-01-29 11:00:00 to 2018-01-29 13:00:00:  33
Value sum from 2018-01-29 13:00:00 to 2018-01-31 13:00:00:  298
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51750164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档