首页 > 解决方案 > 将十进制小时、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  

标签: pythonpandasdataframedatetime

解决方案


您可以将day_of_year//转换为日期时间,例如yeardecimal_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

推荐阅读