检查数据框中的列是否在大纪元时间会给出不同的结果
Checking a column in dataframe is in Epoch time is giving different results
我写了下面的测试代码来检查它是否正常工作,我在 DF 中得到了一个“真”值,但是当我确定对一个值进行相同的计算时,它给了我“假”。正确的值应该是“False”,因为 date_time 列不在 epoch/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
我改编了 的解决方案,以在数据框中创建 'isepoch' 列。
如果你heck pandas.to_numeric, scalar
, list
, tuple
, 1-d array
, 或者Series
都可以转换为参数pandas.to_numeric
.
在你的代码之上,部分如下:
test_df['isepoch'] = pd.notnull(pd.to_numeric(test_df['date_time'], errors='coerce'))
returns true 因为 pandas.to_numeric
接受 series
值。
但是,test_df['date_time'][0]
、scalar
、list
、tuple
、1-d array
或 Series
都不是,如下所示:
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
可接受的参数类型,它将 return True 值。就像下面这样:
In [2]: pd.notnull(pd.to_numeric(np.array(test_df['date_time'][0]), errors='coerce'))
Out[2]: True
如果想了解更多pandas.to_numeric
源码,可以访问here.
我写了下面的测试代码来检查它是否正常工作,我在 DF 中得到了一个“真”值,但是当我确定对一个值进行相同的计算时,它给了我“假”。正确的值应该是“False”,因为 date_time 列不在 epoch/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
我改编了
如果你heck pandas.to_numeric, scalar
, list
, tuple
, 1-d array
, 或者Series
都可以转换为参数pandas.to_numeric
.
在你的代码之上,部分如下:
test_df['isepoch'] = pd.notnull(pd.to_numeric(test_df['date_time'], errors='coerce'))
returns true 因为 pandas.to_numeric
接受 series
值。
但是,test_df['date_time'][0]
、scalar
、list
、tuple
、1-d array
或 Series
都不是,如下所示:
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
可接受的参数类型,它将 return True 值。就像下面这样:
In [2]: pd.notnull(pd.to_numeric(np.array(test_df['date_time'][0]), errors='coerce'))
Out[2]: True
如果想了解更多pandas.to_numeric
源码,可以访问here.