python - 将十进制小时、DOY 和年份转换为日期时间
问题描述
我有一个很长的数据框,在分隔的列中有年份、小数小时和年份(int 格式)。我想将其转换为日期时间并将其设置为数据框的索引。我找到了一种方法,但效率极低。有没有更好的方法来做同样的事情?
这是我的做法(使用我的数据框的 5 个第一个值):
import numpy as np
import pandas as pd
import datetime
varr = np.random.rand(5)
dec_h = [1.96667, 1.97083, 1.97500,1.97917, 1.98333]
doy = [154, 154, 154, 154, 154]
year = [2021, 2021, 2021, 2021, 2021]
df = pd.DataFrame()
df['values'] = varr
df['decimal_hour'] = dec_h
df['day_of_year'] = doy
df['year'] = year
# Convert decimal hours into hours, minutes, seconds
hours = []
minutes = []
seconds = []
for i in range(0,len(df)):
hours.append(str(int(df.decimal_hour.values[i])))
minutes.append(str(int((df.decimal_hour.values[i]*60) % 60)))
seconds.append(str(int((df.decimal_hour.values[i]*3600) % 60)))
# Transform doy to date
date1 = []
for i in range(0,len(df)):
date1.append(datetime.datetime(df.year.values[i], 1, 1) + datetime.timedelta(int(df.day_of_year.values[i]) - 1))
# Convert to string
year = []
month = []
day = []
for i in range(0,len(df)):
year.append(str(date1[i].year))
month.append(str(date1[i].month))
day.append(str(date1[i].day))
# Concatenate everything
date_time = []
for i in range(0,len(df)):
date_time.append(datetime.datetime.strptime(day[i] + '/' + month[i] + '/' + year[i] + ' ' + hours[i] + ':' + minutes[i] + ':' + seconds[i] , "%d/%m/%Y %H:%M:%S"))
df.index = date_time
解决方案
您可以将day_of_year
//转换为日期时间,例如year
:decimal_hour
df["date"] = df.apply(
lambda x: pd.to_datetime(x["year"], format="%Y")
+ pd.DateOffset(days=x["day_of_year"] - 1, hours=x["decimal_hour"]),
axis=1,
)
印刷:
values decimal_hour day_of_year year date
2021-06-03 01:58:00 0.226575 1.96667 154 2021 2021-06-03 01:58:00.012
2021-06-03 01:58:14 0.356103 1.97083 154 2021 2021-06-03 01:58:14.988
2021-06-03 01:58:30 0.566151 1.97500 154 2021 2021-06-03 01:58:30.000
2021-06-03 01:58:45 0.851411 1.97917 154 2021 2021-06-03 01:58:45.012
2021-06-03 01:58:59 0.670402 1.98333 154 2021 2021-06-03 01:58:59.988
推荐阅读
- c++ - 为什么 Clang 分配 std::complex 这么快?
- flutter - 错误:flutter的初始化器中只能访问静态成员
- c# - Selenium Actions DragAndDrop 在两个 ag-grid 之间不起作用
- javascript - Javascript 函数,它接受一个函数或任何要由该函数评估的参数
- php - Laravel 查询排除数据
- coldfusion - Coldfusion/lucee cffile 上传 makeUnique 不太工作
- git - 尽管可以从浏览器访问服务器,但无法从 Visual Studio 2019 连接到 tfs 服务器
- java - 在 0,0 坐标处启动 Random Walker java 程序时出现问题
- mysql - 特定时间范围内的 Mysql groupby 日期计数
- c++ - 调用浮点数组时未定义的引用