首页 > 解决方案 > Python:如何将一系列小时转换为一年中的月、日、小时

问题描述

我有一堆数据表,其中 8760 行代表一年中的每个小时,从 1 月 1 日上午 12 点到 12 月 31 日晚上 11 点按顺序排列。我想创建显示一天中的小时、月中的天和一年中的月份的列如下所示:

+------+-------+-----+------+
| 8760 | Month | Day | Hour |
+------+-------+-----+------+
| 0    | 1     | 1   | 0    |
| 1    | 1     | 1   | 1    |
| 2    | 1     | 1   | 2    |
| ...  | ...   | ... | ...  |
| 814  | 2     | 3   | 22   |
| 815  | 2     | 3   | 23   |
| 816  | 2     | 4   | 0    |
| ...  | ...   | ... | ...  |
| 8758 | 12    | 31  | 22   |
| 8759 | 12    | 31  | 23   |
+------+-------+-----+------+

我可以使用哪些 python 函数来获取所需的“月”、“日”和“小时”列?

标签: python

解决方案


有趣的问题。我发布这个答案,不是为了“为你做你的工作”,而是希望鼓励进一步研究和调查为什么一些代码有效。然后,读者可以进一步了解此示例并进行编辑,以进一步满足您当前和未来的需求。

从教育的角度来看,此示例向用户展示了pandasdatetime库。进一步的研究:

  • pandas.Series.dt日期时间访问器文档在这里
  • 如何使用datetime模块将整数转换为datetime对象。文档在这里
  • 如何使用该timedelta模块来添加/减去日期和时间Docs here

示例代码:

import pandas as pd
from datetime import datetime as dt
from datetime import timedelta as td

# Create the starting date as a `datetime` object.
start = dt(1900, 1, 1, 0, 0, 0)
# List initialiser.
result = [start]

# Build a list of datetime objects for each hour of the year.
for i in range(1, 8760):
    start += td(seconds=3600)
    result.append(start)

# Initialise a DataFrame data structure.
df = pd.DataFrame({'dates': result})
# Add each column by extracting the object of interest from the datetime.
df['8760'] = df.index+1
df['month'] = df['dates'].dt.month
df['day'] = df['dates'].dt.day
df['hour'] = df['dates'].dt.hour
# Remove the datetime object column.
df.drop(['dates'], inplace=True, axis=1)

输出:

      8760  month  day  hour
0        1      1    1     0
1        2      1    1     1
2        3      1    1     2
3        4      1    1     3
4        5      1    1     4
...    ...    ...  ...   ...
8755  8756     12   31    19
8756  8757     12   31    20
8757  8758     12   31    21
8758  8759     12   31    22
8759  8760     12   31    23

推荐阅读