2

这是我时不时回想起的一个问题。我有一个数据集,其中多列(还有其他列,这些只是与问题相关的列)用于指示日期和时间。在将它们从 float 转换为 int 之后,我现在有了:

year    mo      dy  hr min sec Valid Mag
1234    1886    9   1   2   51  4.0 7.3
1286    1893    6   4   2   27  4.0 7.0
1329    1897    8   5   0   10  4.0 7.7
1366    1901    8   9   9   23  4.0 7.2
1368    1901    8   9   18  33  4.0 7.4

将其转换为 DataFrame 中的 DateTime 的最清晰和最惯用的方法是什么,它不仅具有与日期和时间相关的列吗?

在另一个项目中,我使用了这个:

sun['Date'] = sun['Year'].map(str)+ '-' + sun['Month'].map(str) + '-' + sun['Day'].map(str)
pd.to_datetime(sun['Date'], utc=False)

虽然这可行,但我认为肯定有更好、更通用的方法。具体来说,我希望将相关字段组合到 DateTime 中,但同样,数据框中还有其他字段。我在 SQL 中看到了对此的良好响应,但这不是我想要的。

编辑:我已经收到了一些关于日期和时间的 DataFrames 的可靠答案。但是,问题是所有都会导致相同的错误“ValueError:长度不匹配:预期轴有 19 个元素,新值有 6 个元素”所以我添加了几个额外的列。

4

4 回答 4

2

然后更改列名pd.to_datetime

df.columns = ['year','month','day','hour','minute','second']
out = pd.to_datetime(df)
Out[185]: 
1234   1886-09-01 02:51:00
1286   1893-06-04 02:27:00
1329   1897-08-05 00:10:00
1366   1901-08-09 09:23:30
1368   1901-08-09 18:33:45
dtype: datetime64[ns]
于 2021-03-09T02:35:40.133 回答
1

所以这是一种方法,我不知道它是否惯用。

我找到的解决方案是使用这些列名

df.columns = [ 'year', 'month' , 'day' , 'hour' , 'minute'  ,'seconds']
df = pd.DataFrame([[1886,9,1,2,51,0],
[1893,6,4,2,27,0],
[1897,8,5,0,10,0],
[1901,8,9,9,23,30],
[1901,8,9,18,33,45]])

#df.columns = [ 'Year', 'Mo' , 'Dy' , 'Hr' , 'Mn'  ,'Sec']

#use these column names instead of what you have
df.columns = [ 'year', 'month' , 'day' , 'hour' , 'minute'  ,'seconds']

#then you convert to date time
pd.to_datetime(df)
#output
0   1886-09-01 02:51:00
1   1893-06-04 02:27:00
2   1897-08-05 00:10:00
3   1901-08-09 09:23:30
4   1901-08-09 18:33:45
dtype: datetime64[ns]

从 DataFrame 的多列组装日期时间。键可以是常见的缩写,如 ['year', 'month', 'day', 'minute', 'second', 'ms', 'us', 'ns']) 或同一个Source的复数

于 2021-03-09T02:40:49.617 回答
1

实现此目的的另一种方法是使用datetime.strptime()创建一个datetime对象并将df.apply()其添加到一个新列。

df['time'] = df.apply(lambda r: datetime.strptime(f"{r['Year']} {r['Mo']} {r['Dy']} {r['Hr']}:{r['Mn']}:{r['Sec']}", '%Y %m %d %H:%M:%S'), axis=1)

输出:

df['time']
1234   1886-09-01 02:51:00
1286   1893-06-04 02:27:00
1329   1897-08-05 00:10:00
1366   1901-08-09 09:23:30
1368   1901-08-09 18:33:45
Name: time, dtype: datetime64[ns]
于 2021-03-09T02:45:10.277 回答
0

强制 df 为字符串

用于str.pad将值填充到最小值 2

用于str.cat组合值

将结果强制为 datetime 对象。

下面的代码

pd.to_datetime(df.astype(str).apply(lambda x: (x.str.pad(width=2, side='left', fillchar='0')).str.cat(sep=''),axis=1))

1234   1886-09-01 02:51:00
1286   1893-06-04 02:27:00
1329   1897-08-05 00:10:00
1366   1901-08-09 09:23:30
1368   1901-08-09 18:33:45
于 2021-03-09T02:37:53.523 回答