Pandas将datetime64 [ns]列一次性转换为datetime64 [ns,UTC]的多列

3
我有一个名为query_df的数据框,其中一些列是以datetime[ns]格式存储的。
我想一次性地将所有datetime[ns]转换为datetime[ns, UTC]
这是我迄今为止所做的,通过检索datetime[ns]格式的列:
dt_columns = [col for col in query_df.columns if query_df[col].dtype == 'datetime64[ns]']

为了转换它,我可以使用 pd.to_datetime(query_df["column_name"], utc=True)
使用 dt_columns,我想一次性转换dt_columns中的所有列。如何实现呢?
尝试:
query_df[dt_columns] = pd.to_datetime(query_df[dt_columns], utc=True)

错误:

值错误:至少需要指定 [年, 月, 日] 中的 [日,月,年] 缺失

3个回答

3

您需要使用lambda函数来实现这一点。尝试这样做:

df[dt_columns] = df[dt_columns].apply(pd.to_datetime, utc=True)

1
有没有不使用 lambda 函数的解决方案?它很慢。 - user6308605
转换整个数据框怎么样?就像这样。df[dt_columns].astype('datetime64[ns, UTC]') - sahitesh reddypelly
我在数据框中有整数、浮点数和对象。 - user6308605
但是,由于您已经使用dt_columns仅选择了datetime64 [ns]列。因此,在使用df [dt_columns]时,您会过滤掉其他列。 - sahitesh reddypelly

1

您已经完成了过程的第一部分,即通过使用“:”将需要转换数据类型的列的名称进行分组:

dt_columns = [col for col in query_df.columns if query_df[col].dtype == 'datetime64[ns]']

现在,您需要使用Pandas的apply()功能一次将所有列转换为日期时间格式:
query_df[dt_columns] = query_df[dt_columns].apply(pd.to_datetime)

这将把所需的列转换为您指定的数据类型。
编辑:
不使用lambda函数
步骤1:创建一个包含列名(需要更改的列)和它们的数据类型的字典:
convert_dict = {}

步骤2:迭代提取的列名,并将其作为键存储在字典中,其相应值为日期时间:

for col in dt_columns:
    convert_dict[col] = datetime

第三步:现在通过将字典传递到astype()函数中来转换数据类型,就像这样:

query_df = query_df.astype(convert_dict)

通过这样做,所有与键匹配的列的值都将被应用于键的值。

0

您的尝试 query_df[dt_columns] = pd.to_datetime(query_df[dt_columns], utc=True)dt_columns 解释为年、月、日。以下是 to_datetime() 帮助文档中的示例:

Assembling a datetime from multiple columns of a DataFrame. The keys can be
common abbreviations like ['year', 'month', 'day', 'minute', 'second',
'ms', 'us', 'ns']) or plurals of the same

>>> df = pd.DataFrame({'year': [2015, 2016],
...                    'month': [2, 3],
...                    'day': [4, 5]})
>>> pd.to_datetime(df)
0   2015-02-04
1   2016-03-05
dtype: datetime64[ns]

以下是一个代码片段,它给出了一个带有小例子的解决方案。请记住,根据您的数据格式或应用程序,UTC 可能无法给出正确的日期。
import pandas as pd 
 
query_df = pd.DataFrame({"ts1":[1622098447.2419431, 1622098447], "ts2":[1622098427.370945,1622098427], "a":[1,2], "b":[0.0,0.1]}) 
query_df.info() 
 
# convert to datetime in nano seconds 
query_df[["ts1","ts2"]] = query_df[["ts1","ts2"]].astype("datetime64[ns]") 
query_df.info() 
 
#convert to datetime with UTC 
query_df[["ts1","ts2"]] = query_df[["ts1","ts2"]].astype("datetime64[ns, UTC]") 
query_df.info()

输出结果为:

   <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 2 entries, 0 to 1
    Data columns (total 4 columns):
     #   Column  Non-Null Count  Dtype  
    ---  ------  --------------  -----  
     0   ts1     2 non-null      float64
     1   ts2     2 non-null      float64
     2   a       2 non-null      int64  
     3   b       2 non-null      float64
    dtypes: float64(3), int64(1)
    memory usage: 192.0 bytes
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 2 entries, 0 to 1
    Data columns (total 4 columns):
     #   Column  Non-Null Count  Dtype         
    ---  ------  --------------  -----         
     0   ts1     2 non-null      datetime64[ns]
     1   ts2     2 non-null      datetime64[ns]
     2   a       2 non-null      int64         
     3   b       2 non-null      float64       
    dtypes: datetime64[ns](2), float64(1), int64(1)
    memory usage: 192.0 bytes
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 2 entries, 0 to 1
    Data columns (total 4 columns):
     #   Column  Non-Null Count  Dtype              
    ---  ------  --------------  -----              
     0   ts1     2 non-null      datetime64[ns, UTC]
     1   ts2     2 non-null      datetime64[ns, UTC]
     2   a       2 non-null      int64              
     3   b       2 non-null      float64            
    dtypes: datetime64[ns, UTC](2), float64(1), int64(1)
    memory usage: 192.0 byte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接