检查数据框中的列是不是处于纪元时间会给出不同的结果

Posted

技术标签:

【中文标题】检查数据框中的列是不是处于纪元时间会给出不同的结果【英文标题】:Checking a column in dataframe is in Epoch time is giving different results检查数据框中的列是否处于纪元时间会给出不同的结果 【发布时间】:2021-11-10 18:09:11 【问题描述】:

我编写了下面的测试代码来检查它是否正常工作,我在 DF 中得到一个“真”值,但是当我确定对一个值进行相同的计算时,它给了我“假”。正确的值应该是“False”,因为 date_time 列不在纪元/UNIX 时间中

import pandas as pd
from datetime import datetime, timedelta
temp_list = []
i = 1
while i < 10:
    d = 
        'ticker': 'TEST',
        'date_time': datetime.now() + timedelta(days=i),
        'price': 100 + i,
        'volume': i
    
    temp_list.append(d)
    i += 1
test_df = pd.DataFrame(data=temp_list)
test_df['isepoch'] = pd.notnull(pd.to_numeric(
    test_df['date_time'], errors='coerce'))
print(test_df)
print(pd.notnull(pd.to_numeric(test_df['date_time'][0], errors='coerce')))

两个打印语句的输出:

  ticker                  date_time  price  volume  isepoch
0   TEST 2021-09-16 10:33:43.285935    101       1     True
1   TEST 2021-09-17 10:33:43.285935    102       2     True
2   TEST 2021-09-18 10:33:43.285935    103       3     True
3   TEST 2021-09-19 10:33:43.285935    104       4     True
4   TEST 2021-09-20 10:33:43.285935    105       5     True
5   TEST 2021-09-21 10:33:43.285935    106       6     True
6   TEST 2021-09-22 10:33:43.285935    107       7     True
7   TEST 2021-09-23 10:33:43.285935    108       8     True
8   TEST 2021-09-24 10:33:43.285935    109       9     True
False

我调整了来自 Pandas: Check if value is epoch time using python 的解决方案,以在数据框中创建 'isepoch' 列。

【问题讨论】:

【参考方案1】:

如果你知道pandas.to_numeric、scalarlisttuple1-d arraySeries 可以转换为 pandas.to_numeric 的参数。

在您的代码上方,部分如下:

test_df['isepoch'] = pd.notnull(pd.to_numeric(test_df['date_time'], errors='coerce'))

返回 true,因为 pandas.to_numeric 接受 series 值。

但是,test_df['date_time'][0] 两者都不是,scalarlisttuple1-d arraySeries 如下:

In [1]: print(type(test_df['date_time'][0]) == list)
   ...: print(type(test_df['date_time'][0]) == tuple)
   ...: print(type(test_df['date_time'][0]) == np.array)
   ...: print(type(test_df['date_time'][0]) == pd.Series)
   ...: print(np.isscalar(test_df['date_time'][0]))
False
False
False
False
False

因此,如果您将test_df['date_time'][0] 更改为pandas.to_numeric 可接受的参数类型,它将返回True 值。就像下面这样:

In [2]: pd.notnull(pd.to_numeric(np.array(test_df['date_time'][0]), errors='coerce'))
Out[2]: True

如果您想了解更多关于pandas.to_numeric源代码的信息,可以访问here。

【讨论】:

以上是关于检查数据框中的列是不是处于纪元时间会给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

在火花中比较两个数据框中的列

如何对一个数据框中的列值求和并将结果添加为另一个数据框中的列?

应用 StringIndexer 更改 PySpark 数据框中的列

将纪元时间转换为熊猫数据框中的格式化日期字符串

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

使用 pandas 连接两个数据框中的不同列(并附加相似的列)