【问题标题】:Iterate over unique date and hour in the pandas dataframe to run a function迭代 pandas 数据框中的唯一日期和时间以运行函数
【发布时间】:2021-06-21 23:10:36
【问题描述】:

您好,我目前正在按数据框中的唯一日期运行 for 循环,以将其传递给函数。 但是,我想要的是通过我的数据框迭代唯一的日期和时间(例如 2020-12-18 15:00、2020-12-18 16:00)。有没有办法做到这一点?

这是我的代码和我的数据框示例。

for day in df['DateTime'].dt.day.unique():
    testdf = df[df['DateTime'].dt.day == day]
    testdf.set_index('DateTimeStarted', inplace=True)
    output = mk.original_test(testdf, alpha =0.05)
    output_df = pd.DataFrame(output).T
    output_df.rename({0:"Trend", 1: "h", 2:"p", 3:"z", 4:"Tau", 5:"s", 6:"var_s", 7:"slope", 8:"intercept"}, axis = 1, inplace = True)
    result_df = result_df.append(output_df)
DateTime                Values
0   2020-12-18 15:00:00 554.0
1   2020-12-18 15:00:00 594.0
2   2020-12-18 15:00:00 513.0
3   2020-12-18 16:00:00 651.0
4   2020-12-18 16:00:00 593.0
5   2020-12-18 17:00:00 521.0
6   2020-12-18 17:00:00 539.0
7   2020-12-18 17:00:00 534.0
8   2020-12-18 18:00:00 562.0
9   2020-12-19 08:00:00 511.0
10  2020-12-19 09:00:00 512.0
11  2020-12-19 09:00:00 584.0
12  2020-12-19 09:00:00 597.0
13  2020-12-22 09:00:00 585.0
14  2020-12-22 09:00:00 620.0
15  2020-12-22 09:00:00 593.0

【问题讨论】:

  • 所以只需要删除2次.dt.day
  • 抱歉没有真正理解你的意思。实际的数据框有超过 2 个日期。这里显示的只是一个示例
  • 我认为您的解决方案中应该删除.dt.day
  • 上述解决方案很好

标签: python-3.x pandas datetime time-series


【解决方案1】:

如果需要按DataFrame中的所有日期过滤,您可以使用groupby

for day, testdf in df.groupby('DateTime'):
    testdf.set_index('DateTimeStarted', inplace=True)
    output = mk.original_test(testdf, alpha =0.05)
    output_df = pd.DataFrame(output).T
    output_df.rename({0:"Trend", 1: "h", 2:"p", 3:"z", 4:"Tau", 5:"s", 6:"var_s", 7:"slope", 8:"intercept"}, axis = 1, inplace = True)
    result_df = result_df.append(output_df)

编辑:如果需要过滤列表中的某些日期,请使用:

for date in ['2020-12-18 15:00', '2020-12-18 16:00']:
    testdf = df[df['DateTime'] == date]
    testdf.set_index('DateTimeStarted', inplace=True)
    output = mk.original_test(testdf, alpha =0.05)
    output_df = pd.DataFrame(output).T
    output_df.rename({0:"Trend", 1: "h", 2:"p", 3:"z", 4:"Tau", 5:"s", 6:"var_s", 7:"slope", 8:"intercept"}, axis = 1, inplace = True)
    result_df = result_df.append(output_df)

编辑1:

for date in df['DateTime']:
    testdf = df[df['DateTime'] == date]
    testdf.set_index('DateTimeStarted', inplace=True)
    output = mk.original_test(testdf, alpha =0.05)
    output_df = pd.DataFrame(output).T
    output_df.rename({0:"Trend", 1: "h", 2:"p", 3:"z", 4:"Tau", 5:"s", 6:"var_s", 7:"slope", 8:"intercept"}, axis = 1, inplace = True)
    result_df = result_df.append(output_df)

【讨论】:

  • 试过不行。发生的情况是它将包含不在数据框中的日期或时间,并在我运行该函数时返回错误。
  • 编辑后的答案不是我想要的,因为我们需要硬编码日期和时间 ['2020-12-18 15:00', '2020-12-18 16:00' ]。我正在寻找一个适用于任何唯一日期和时间的答案
  • @DanielChang - 所以需要 EDIT1 就像 cmets 中提到的那样?
  • 我刚刚评估了我的数据集,我得到的错误是由于数据集在某些日期时间段内只有 1 个数据点,因此出现错误。您的代码运行良好。
猜你喜欢
  • 2020-10-29
  • 2020-10-08
  • 2021-02-26
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多