当前位置: 首页 > 知识库问答 >
问题:

如何从日期拆分年并创建新列;如何应对闰年

宦飞
2023-03-14

我对编码非常陌生(这是我正在写的第一个代码)。

我有多个csv文件,都有相同的标题。这些文件对应于一年中每天的每小时臭氧浓度,每个文件都是一个单独的年份[范围从2009年到2020年]。我有一列“date”包含年-月-日,还有一列表示一天中的小时(0-23)。我想将年与月日分开,将小时与月日合并,并将其作为索引,然后将其他csv文件合并到一个数据帧中。

此外,我需要对10年中每天每小时的数据值进行平均,但是,我的三个文件包括闰日(额外的24个值)。如能就如何解释闰年提供任何建议,我将不胜感激。我假设我需要在没有闰日的情况下将闰日添加到文件中,然后提供空值,然后删除空值(但这似乎是循环的)。

此外,如果你有任何关于如何简化我的过程的建议,请随时分享!

提前感谢你的帮助。

更新:我尝试了下面Rookie的建议,但是在导入csv数据后,我收到了一条错误消息:

import pandas as pd
import os
path = "C:/Users/heath/Documents/ARB project Spring2020/ozone/SJV/SKNP"
df = pd.DataFrame()
for file in os.listdir(path):
    df_temp = pd.read_csv(os.path.join(path, file))
    df = pd.concat((df, df_temp), axis = 0)

首先,我得到一个错误消息,上面写着OSError:从文件初始化失败。我试图通过添加Engine='python'来解决这个问题,基于OSError的建议:从Pandas中的csv文件初始化失败,但现在我得到了PermissionError:[Errno 13]权限被拒绝:'C:/用户/希思/文档/ARB项目Spring2020/臭氧/SJV/SKNP\\。ipynb_checkpoints'

请帮忙,我不知道还能做什么。我编辑了权限,这样每个人都可以阅读

共有1个答案

蒋波光
2023-03-14

首先,您要在熊猫数据帧中确定您正在处理的列类型。这可以通过dtype方法来实现。例如,如果您的DataFrame是df,您可以执行df.dtypes,这将让您知道列类型是什么。如果您看到一个对象类型,这将告诉您熊猫正在将对象解释为字符串(字符序列,而不是实际的日期或时间值)。如果你看到datetime64[ns],熊猫知道这是一个datetime值(日期和时间的组合)。如果你看到timedelta[ns],熊猫知道这是一个时间差(稍后会有更多内容)。

如果dtype对象,让我们将它们转换为datetime64[ns]类型,这样我们就可以让熊猫知道我们正在处理日期/时间值。这可以通过简单的重新分配来完成。例如,如果日期的格式是YYYY-mm-dd(2020-06-04),那么我们可以使用以下方法转换日期列(假设您的日期列的名称为“日期”)。请参考strftime的不同格式。

df["Date"] = pd.to_datetime(df["Date"], format="%Y-%m-%d")

时间列稍微复杂一些。熊猫不知道时间,所以我们需要将时间转换为timedelta[64]。如果时间格式为hh:mm:ss(即“21:02:24”),我们可以使用以下方法转换对象类型。

df["Time"] = pd.to_timedelta(df["Time"])

如果格式不同,则需要将字符串格式转换为hh:mm:ss格式。

现在要组合这些列,我们可以简单地添加它们:

df["DateTime"] = df["Date"] + df["Time"]

要创建您提到的格式化日期时间列,可以通过创建字符串格式的新列来实现。下面将给出“06-04 21”,表示6月4日至9日下午。strftime可以指导你想要的任何格式。

df["Formatted_DateTime"] = df["DateTime"].dt.strftime("%m-%d %H")

您需要为每个文件执行此操作。我建议在这里使用for循环。下面是完整的代码片段。这显然会根据您的列类型、文件名等而有所不同。

import os # module to iterate over the files
import pandas as pd

base_path = "path/to/directory" # This is the directory path where all your files are stored

# It will be faster to read in all files at once THEN format the date
df = pd.DataFrame()
for file in os.listdir(base_path):
    df_temp = pd.read_csv(os.path.join(base_path, file)) # This will read every file in the base_path directory
    df = pd.concat((df, df_temp), axis=0) # Concatenating (merging) the files

# Formatting the data
df["Date"] = pd.to_datetime(df["Date"], format="%Y-%m-%d") # Date conversion
df["Time"] = pd.to_timedelta(df["Time"]) # Time conversion
df["DateTime"] = df["Date"] + df["Time"] # Combine date and time to single column
df["Formatted_DateTime"] = df["DateTime"].dt.strftime("%m-%d %H") # Format the datetime values

既然所有内容都已格式化,那么平均部分就很容易了。由于您只对每个月每天小时的平均值感兴趣,因此我们可以使用groupby功能。

df_group = df.groupby(["Formatted_DateTime"]) # This will group you data by unique values of the "Formatted_DateTime" column
df_average = df_group.mean() # This will average your data within each group (accounting for the leap years)

检查你的工作总是好的!

print(df_average.head(5)) # This will print the first 5 days averaged values
 类似资料:
  • 问题内容: 我有一个数据框,它提供两个整数列,分别是年份和年份: 我需要从这两个数字创建一个datetime-object。 我试过了,但是抛出一个错误: 然后我尝试了一下,它可以工作,但是给出了错误的结果,那就是它完全忽略了一周: 我真的迷失在Python ,Numpy和Pandas之间,您能告诉我它是如何正确完成的吗? 我正在使用Python 3,如果这在任何方面都有意义的话。 编辑: 从Py

  • 问题内容: 输出为: 1988年 1月25 日星期三00:00:08 IST 1989 我过去了,但我得到了。为什么? 问题答案: 日历中的月份从零开始。因此,将12解释为12月+ 1个月。用

  • 输出为: 1988 1989年1月25 00:00:08日星期三 我通过了1988年12月25日的考试,但我得到了1989年1月25日的考试。为什么?

  • 下面的函数是用来检测闰年的,闰年是(在每一个可以被4平均整除的年份--除了每一个可以被100平均整除的年份--除非这一年也可以被400平均整除) 因此,如果是闰年,它返回,如果不返回,但问题是即使是闰年,它也总是返回,为什么?以及如何修复

  • 当我使用以下代码时,Object错误。 谁能告诉我如何从年、月和日的值中获取Date对象?

  • 本文向大家介绍如何从Swift Xcode中的日期创建日期对象?,包括了如何从Swift Xcode中的日期创建日期对象?的使用技巧和注意事项,需要的朋友参考一下 来自Objective C- Background,现在我们不需要使用NSDate,因为Swift已定义了自己的结构类型Date。日期桥接到NSDate类。您可以在与Objective-C API交互的代码中互换使用这些代码。 要了解有