【问题标题】:Group data from multiple columns in a csv in Python by timestamps over a defined time range在定义的时间范围内按时间戳对 Python 中 csv 中多列的数据进行分组
【发布时间】:2015-05-23 02:27:18
【问题描述】:

这是我正在尝试做的事情,但我陷入了困境:需要能够在记录数据时对 csv 文件中不同数据列中的不同行进行分组和绘制图表,或者发生在白天或夜间(定义为日出,即 CDT 上午 6:18 到日落,即 CDT 下午 7:27)。我有数百天的数据要分析。我有多个 csv 文件可供使用和比较,但需要将夜间结果与白天结果与其他数据进行比较/关联。由于日出和日落时间每天都在变化,我制作了一个 Excel(csv 文件),其中每天的日出和日落时间分别列在不同的列中。此外,如何在定义的时间范围内(白天与夜间)按周或天绘制和分组所述数据。请帮助一个不擅长 Python 编码但渴望学习的苦苦挣扎的理科学生!

来自 csv 文件的样本数据(每个时间戳间隔为 30 分钟,多天)

    Timestamp        Avg Conc for 30 min    Avg. Wind
    5/20/2014 18:30              4.56789        31.23
    5/20/2014 19:00              5.67890        42.34
    5/20/2014 19:30              3.45678        23.45
    5/20/2014 20:00              6.54321        34.56
    5/20/2014 20:30              4.12345        41.23
    5/20/2014 21:00              3.98765        19.87

示例数据集#2(日出和日落时间)

    Date          Sunrise          Sunset
    5/20/2014     5:33:00          20:06:00
    5/21/2014     5:32:00          20:07:00
    5/22/2014     5:31:00          20:08:00
    5/23/2014     5:31:00          20:08:00

我的问题是如何从单独的 csv 文件中提取,安排在这个时间范围内(日光 = 日出到日落的时间)以 >=15 分钟到下一个 30 分钟的间隔向上取整,如果

我提前感谢任何可以帮助我完成大多数人认为容易或简单但对于像我这样的 Python 新手来说很复杂的任务的人。

编辑:这是我在文件中读取的代码...

    import numpy as np
    import pandas as pd
    from datetime import datetime

    flux = pd.read_csv('C:\step4n5.csv')
    weather = pd.read_csv('C:\Weather_Data.csv')

    header1 = flux.next() #header
    header2 = weather.next()

    for for Timestamp, Avg Flux Concentration (Fc) in flux:
        Timestamp = datetime.strptime(Timestamp, "%M-%d-%y %H:%M:%S")
    for Date, Sunrise, Sunset in weather:
        Date = datetime.strptime(Date, "%M-%d-%y")
        Sunrise

我被困在这里了。不确定我是否正确读取/提取时间戳。

【问题讨论】:

  • 你在这个问题上有很多问题:-)。您是否有多个相同格式的“观察”文件和一个日出/日落文件?
  • 是的。日出/日落是一个 csv 文件。另一个文件有很多列,我想将它们与夜间值和白天值进行比较。
  • 好的,使用 pandas read_csv(() 来导入它们
  • 是的,正如 Bob 所说,您在这里有很多事情要做。如果您按步骤执行此操作并展示您的工作,您可能会获得更多帮助。只需从读取(或至少尝试读取)所有数据集开始,然后从那里开始。
  • 这里是示例数据文件链接:drive.google.com/file/d/0B3972uqY0U8MdFRoTDAzZXlLNmc/…

标签: python python-2.7 numpy pandas


【解决方案1】:

通过多种不同的方式来完成这应该不会太难。正如其他人所建议的那样,您可以包含更多数据并展示更多您的工作以获得更明确的答案。很难判断您是否已经将 DataFrame 移动到时间序列中。

最好的方法是发布包含更多数据的 CSV,并显示您用于读取数据的命令,以便我们查看您是否具有日期时间功能以及列的数据类型。

假设您的列只是常规列,那么一种非常低效的方法应该可以在每天 48 行的 100 天内正常工作,那就是执行双 for 循环并将日出和日落时间添加为第一个 DataFrame 上的额外列。然后,您可以根据时间是否在日出和日落之间的逻辑添加另一个白天列。我知道这很不靠谱,但类似于:

#Create a new date only column from the first part of the timestamp:
df1['Date']=string(df1.Datetime)[0:9]
#Create a new time only column from the second half of the timestamp
#and convert hours and minutes into minutes:
df1['Time']=int(string(df1.Datetime)[10:12])*60+int(string(df1.Datetime)[13:15])
#Create new sunrise and sunset collumns
import numpy as np
df1["sunrise"] = np.nan
df1["sunset"] = np.nan
for row in df1:
    for row2 in df2:
        if row.Date==row2.Date:
            df1.sunrise=df2.sunrise
            df1.sunset=df2.sunset
#add in the daylight column if it is between sunrise and sunset
df['daylight']=df1.Time>int(string(df1.sunrise[0:2])*60+int(string(df1.sunrise)[3:5] and df1.Time<int(string(df1.sunset[0:2])*60+int(string(df1.sunset)[3:5]

即df.daylight 将是一个布尔值,用于判断是否是日光。这可能是错误的,但您可能会收集到它的客人。

然后您可以查询布尔值以仅恢复白天或夜间项目:

df[df.daylight==True]
df[df.daylight==False]

日期时间功能将允许您使用“介于”功能。如果 pandas 知道这些是时间,您还可以在小时和分钟之间进行转换,我很确定它会(取决于您阅读内容的方式)。

希望这会有所帮助!像 Wes McKinney 这样的人可能会使用 2 行方式来完成此任务 :-)

【讨论】:

【解决方案2】:

一种方法可以做到这一点。因此,鉴于上面的数据帧(通量、天气)

我们将首先在通量框架中创建一个名为 Date 的新列。这将是 Timestamp 的日期部分,它很可能是基于您如何导入它的字符串。我们还将使用 pd.to_datetime() 将 Timestamp 转换为日期时间格式

flux["Date"] = flux["Timestamp"].map(lambda d : d.split(" ")[0]) #gotta be a better way
flux["Timestamp"] = pd.to_datetime(flux["Timestamp"])
flux

Timestamp   Avg Conc for 30 min Avg. Wind   Date
0   2014-05-20 18:30:00  4.56789     31.23   5/20/2014
1   2014-05-20 19:00:00  5.67890     42.34   5/20/2014
2   2014-05-20 19:30:00  3.45678     23.45   5/20/2014
3   2014-05-20 20:00:00  6.54321     34.56   5/20/2014
4   2014-05-20 20:30:00  4.12345     41.23   5/20/2014
5   2014-05-20 21:00:00  3.98765     19.87   5/20/2014

现在让我们使用 merge() 将通量和天气组合成一帧

combined = pd.merge(flux,weather,on="Date")
combined
    Timestamp   Avg Conc for 30 min Avg. Wind   Date    Sunrise Sunset
0   2014-05-20 18:30:00  4.56789     31.23   5/20/2014   5:33:00     20:06:00
1   2014-05-20 19:00:00  5.67890     42.34   5/20/2014   5:33:00     20:06:00
2   2014-05-20 19:30:00  3.45678     23.45   5/20/2014   5:33:00     20:06:00
3   2014-05-20 20:00:00  6.54321     34.56   5/20/2014   5:33:00     20:06:00
4   2014-05-20 20:30:00  4.12345     41.23   5/20/2014   5:33:00     20:06:00
5   2014-05-20 21:00:00  3.98765     19.87   5/20/2014   5:33:00     20:06:00

现在我们合并并转换我们的日期和日出/日落列。

combined["Sunrise"] = pd.to_datetime(combined["Date"] + " " + combined["Sunrise"])
combined["Sunset"] = pd.to_datetime(combined["Date"] + " " + combined["Sunset"])
combined

由于我们合并了两个数据框,我们可以利用 pandas 布尔索引并更新一个名为 TOW 的新列

rowindex = (combined["Timestamp"] > combined["Sunrise"]) & (combined["Timestamp"] < combined["Sunset"])
combined.loc[rowindex,"TOW"] = "daytime"
combined.loc[~rowindex,"TOW"] = "nightime"  # ~ is used as a "not"
combined[["Timestamp","Avg Conc for 30 min","Avg. Wind","TOW"]] #subset of combined

    Timestamp   Avg Conc for 30 min Avg. Wind   TOW
0   2014-05-20 18:30:00  4.56789     31.23   daytime
1   2014-05-20 19:00:00  5.67890     42.34   daytime
2   2014-05-20 19:30:00  3.45678     23.45   daytime
3   2014-05-20 20:00:00  6.54321     34.56   daytime
4   2014-05-20 20:30:00  4.12345     41.23   nightime
5   2014-05-20 21:00:00  3.98765     19.87   nightime

【讨论】:

  • 哈夫纳先生的回复很好。我如何将所有白天的 TOW 值绘制/分组在一起?我将如何绘制/分组夜间 TOW?例如,如果我想绘制一周的所有日光平均值。风?
  • 谢谢,会的。你是福报!非常感谢您的帮助,让我指明了正确的方向!
  • 没问题。试一试我的建议,查看 group by() 并在需要帮助时发布另一个问题
  • 当我输入以下脚本时出现错误 combine["Sunrise"] = pd.to_datetime(combined["Date"] + " " + combined["Sunrise"]) combined["Sunset"] = pd.to_datetime(combined["Date"] + " " + combined["Sunset"])
  • combined["Sunrise"] = pd.to_datetime(combined["Date"] + " " + combined["Sunrise"])
猜你喜欢
  • 2014-07-23
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2021-12-22
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多